blob: 3e16492babdb811028335d3244d8968d42a51dc3 [file] [log] [blame]
/* -*-C++-*-
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
*****************************************************************************
*
* File: NADefaults.cpp
* Description: Implementation for the defaults table class, NADefaults.
*
* Created: 7/11/96
* Language: C++
*
*
*
*
*****************************************************************************
*/
#define SQLPARSERGLOBALS_FLAGS // must precede all #include's
#define SQLPARSERGLOBALS_NADEFAULTS
#include "Platform.h"
#include "NADefaults.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef NA_HAS_SEARCH_H
#include <search.h> // use the bsearch binary search routine of the C RTL
#else
#include <unistd.h> // on OSS, bsearch comes from unistd.h
#endif
#include "nsk/nskport.h"
#if !defined(NDEBUG)
#endif
#include "CliDefs.h"
#include "CliSemaphore.h"
#include "CmpContext.h"
#include "CmpErrors.h"
#include "ComObjectName.h"
#include "ComRtUtils.h"
#include "ComSchemaName.h"
#include "ex_error.h"
#include "DefaultConstants.h"
#include "DefaultValidator.h"
#include "NAClusterInfo.h"
#include "parser.h"
#include "sql_id.h"
#include "SQLCLIdev.h"
#include "Sqlcomp.h"
#include "StmtCompilationMode.h"
#include "OptimizerSimulator.h"
#include "CmpSeabaseDDL.h"
#include "Globals.h"
#include "QCache.h"
#include "SqlParserGlobals.h" // MUST be last #include!
#include "seabed/ms.h"
#include "seabed/fs.h"
#define NADHEAP CTXTHEAP
#define ERRWARN(msg) ToErrorOrWarning(msg, errOrWarn)
#define ERRWARNLOOP(msg) ToErrorOrWarning(msg, errOrWarnLOOP)
#define ENUM_RANGE_CHECK(e) (e >= 0 && (size_t)e < numDefaultAttributes())
#define ATTR_RANGE_CHECK ENUM_RANGE_CHECK(attrEnum)
#ifndef NDEBUG
#define ATTR_RANGE_ASSERT CMPASSERT(ATTR_RANGE_CHECK)
#else
#define ATTR_RANGE_ASSERT
#endif
// -------------------------------------------------------------------------
// This table contains defaults used in SQLARK.
// To add a default, put it in sqlcomp/DefaultConstants.h and in this table.
//
// The #define declares the domain (allowed range of values) of the attr-value;
// typically it is Int1 or UI1 (signed or unsigned integral, >=1)
// to prevent division-by-zero errors in the calling code.
//
// The first column is the internal enum value from sqlcomp/DefaultConstants.h.
// The second column is the default value as a string.
//
// The DDxxxx macro identifies the domain of the attribute
// (the range and properties of the possible values).
//
// XDDxxxx does the same *and* externalizes the attribute
// (makes it visible to SHOWCONTROL; *you* need to tell Pubs to document it).
//
// SDDxxxx does the same and externalizes the attribute to HP support personnel
// (makes it visible to HPDM when support is logged on; *you* need to tell Pubs
// to document it in the support manual. You can set the
// SHOWCONTROL_SUPPORT_ATTRS CQD to ON to see all the externalized and
// support-level CQDs).
//
// For instance, DDflt0 allows any nonnegative floating-point number, while
// DDflte allows any positive float (the e stands for epsilon, that tiniest
// scintilla >0 in classical calculus, and something like +1E-38 on a Pentium).
// DDui allows only nonnegative integral values (ui=unsigned int),
// DDui1 allows only ints > 0, DDui2 only nonzero multiples of 2, etc.
//
// DDkwd validates keywords. Each attribute that is DDkwd has its own subset
// of acceptable tokens -- the default behavior is that the attr is bivalent
// (ON/OFF or TRUE/FALSE or ENABLE/DISABLE). If you want different keywords,
// see enum DefaultToken in DefaultConstants.h, and NADefaults::token() below.
//
// Other DD's validate percentages, and Ansi names. Certainly more could be
// defined, for more restrictive ranges or other criteria.
// *************************************************************************
// NOTE: You must keep the entire list in alphabetical order,
// or else the lookup will not work!!!!!!! Use only CAPITAL LETTERS!!!!!!!!!
// *************************************************************************
// NOTE 2: If you choose to "hide" the default default value by setting it to
// "ENABLE" or "SYSTEM" or "", your code must handle this possibility.
//
// See OptPhysRelExpr.cpp's handling of PARALLEL_NUM_ESPS,
// an unsigned positive int which also accepts the keyword setting of "SYSTEM".
// See ImplRule.cpp's use of INSERT_VSBB, a keyword attr which allows "SYSTEM".
//
// A simple way to handle ON/OFF keywords that you want to hide the default for:
// Take OPTIMIZER_PRUNING as an example. Right now, it appears below with
// default "OFF", and opt.cpp does
// DisablePruning = (NADEFAULT(OPTIMIZER_PRUNING) == DF_OFF);
// To hide the default default,
// you would enter it below as "SYSTEM", and opt.cpp would do
// DisablePruning = (NADEFAULT(OPTIMIZER_PRUNING) != DF_ON);
// (i.e., DF_OFF and DF_SYSTEM would be treated identically, as desired).
// *************************************************************************
// NOTE 3: The user is always allowed to say
// CONTROL QUERY DEFAULT attrname 'SYSTEM'; -- or 'ENABLE' or ''
// What this means is that the current setting for that attribute
// reverts to its default-default value. This default-default value
// may or may not be "SYSTEM"; this is completely orthogonal/irrelevant
// to the CQD usage.
//
// One gotcha: 'ENABLE' is a synonym for 'SYSTEM', *EXCEPT* when the
// SYSTEM default (the default-default) is "DISABLE".
// In this case, 'ENABLE' is a synonym for 'ON'
// (the opposite of the synonyms DISABLE/OFF).
// *************************************************************************
// NOTE 4: After modifying this static table in any way, INCLUDING A CODE MERGE,
// for a quick sanity check, run w:/toolbin/checkNAD.
// For a complete consistency check, compile this file, link arkcmp, and
// runregr TEST050.
// *************************************************************************
struct DefaultDefault
{
enum DefaultConstants attrEnum;
const char *attrName;
const char *value;
const DefaultValidator *validator;
UInt32 flags;
};
#define DD(name,value,validator) { name, "" # name "", value, validator }
#define FDD(name,value,validator,flags) { name, "" # name "", value, validator, flags }
#define XDD(name,value,validator) FDD(name,value,validator,DEFAULT_IS_EXTERNALIZED)
#define SDD(name,value,validator) FDD(name,value,validator,DEFAULT_IS_FOR_SUPPORT)
#define DDS(name,value,validator) FDD(name,value,validator,DEFAULT_IS_SSD)
#define XDDS(name,value,validator) FDD(name,value,validator,DEFAULT_IS_SSD | DEFAULT_IS_EXTERNALIZED)
#define SDDS(name,value,validator) FDD(name,value,validator,DEFAULT_IS_SSD | DEFAULT_IS_FOR_SUPPORT)
#define DD_____(name,value) DD(name,value,&validateUnknown)
#define XDD_____(name,value) XDD(name,value,&validateUnknown)
#define SDD_____(name,value) SDD(name,value,&validateUnknown)
#define DDS_____(name,value) DDS(name,value,&validateUnknown)
#define XDDS_____(name,value) XDDS(name,value,&validateUnknown)
#define DDansi_(name,value) DD(name,value,&validateAnsiName)
#define XDDansi_(name,value) XDD(name,value,&validateAnsiName)
#define DDcoll_(name,value) DD(name,value,&validateCollList)
#define DDint__(name,value) DD(name,value,&validateInt)
#define SDDint__(name,value) SDD(name,value,&validateInt)
#define XDDint__(name,value) XDD(name,value,&validateInt)
#define DDSint__(name,value) DDS(name,value,&validateInt)
#define XDDSint__(name,value) XDDS(name,value,&validateInt)
#define XDDintN2(name,value) XDD(name,value,&validateIntNeg2)
#define DDintN1__(name,value) DD(name,value,&validateIntNeg1)
#define DDpct__(name,value) DD(name,value,&validatePct)
#define XDDpct__(name,value) XDD(name,value,&validatePct)
#define SDDpct__(name,value) SDD(name,value,&validatePct)
#define DDpct1_50(name,value) DD(name,value,&validatePct1_t50)
#define DD0_10485760(name,value) DD(name,value,&validate0_10485760)
#define DD0_255(name,value) DD(name,value,&validate0_255)
#define DD0_200000(name,value) DD(name,value,&validate0_200000)
#define XDD0_200000(name,value) XDD(name,value,&validate0_200000)
#define DD1_200000(name,value) DD(name,value,&validate1_200000)
#define XDDui30_32000(name,value) XDD(name,value,&validate30_32000)
#define DDui30_246(name,value) DD(name,value,&validate30_246)
#define DDui50_4194303(name,value) DD(name,value,&validate50_4194303)
#define DD1_24(name,value) DD(name,value,&validate1_24)
#define XDD1_1024(name,value) XDD(name,value,&validate1_1024)
#define DD1_1024(name,value) DD(name,value,&validate1_1024)
#define DD18_128(name,value) DD(name,value,&validate18_128)
#define DD1_128(name,value) DD(name,value,&validate1_128)
#define DDui___(name,value) DD(name,value,&validateUI)
#define XDDui___(name,value) XDD(name,value,&validateUI)
#define SDDui___(name,value) SDD(name,value,&validateUI)
#define DDui1__(name,value) DD(name,value,&validateUI1)
#define XDDui1__(name,value) XDD(name,value,&validateUI1)
#define SDDui1__(name,value) SDD(name,value,&validateUI1)
#define DDui2__(name,value) DD(name,value,&validateUI2)
#define XDDui2__(name,value) XDD(name,value,&validateUI2)
#define DDui8__(name,value) DD(name,value,&validateUI8)
#define DDui512(name,value) DD(name,value,&validateUI512)
#define DDui0_5(name,value) DD(name,value,&validateUIntFrom0To5)
#define XDDui0_5(name,value) XDD(name,value,&validateUIntFrom0To5)
#define DDui1_6(name,value) DD(name,value,&validateUIntFrom1To6)
#define DDui1_8(name,value) DD(name,value,&validateUIntFrom1To8)
#define DDui1_10(name,value) DD(name,value,&validateUIntFrom1To10)
#define DDui2_10(name,value) DD(name,value,&validateUIntFrom2To10)
#define DDui1500_4000(name,value) DD(name,value,&validateUIntFrom1500To4000)
#define DDipcBu(name,value) DD(name,value,&validateIPCBuf)
#define XDDipcBu(name,value) XDD(name,value,&validateIPCBuf)
#define DDflt__(name,value) DD(name,value,&validateFlt)
#define XDDflt__(name,value) XDD(name,value,&validateFlt)
#define SDDflt__(name,value) SDD(name,value,&validateFlt)
#define DDflt0_(name,value) DD(name,value,&validateFlt0)
#define XDDflt0_(name,value) XDD(name,value,&validateFlt0)
#define SDDflt0_(name,value) SDD(name,value,&validateFlt0)
#define DDflte_(name,value) DD(name,value,&validateFltE)
#define XDDflte_(name,value) XDD(name,value,&validateFltE)
#define SDDflte_(name,value) SDD(name,value,&validateFltE)
#define DDflt1_(name,value) DD(name,value,&validateFlt1)
#define XDDflt1_(name,value) XDD(name,value,&validateFlt1)
#define DDflt_0_1(name,value) DD(name,value,&validateFlt_0_1)
#define XDDflt_0_1(name,value) XDD(name,value,&validateFlt_0_1)
#define DDkwd__(name,value) DD(name,value,&validateKwd)
#define XDDkwd__(name,value) XDD(name,value,&validateKwd)
#define SDDkwd__(name,value) SDD(name,value,&validateKwd)
#define DDSkwd__(name,value) DDS(name,value,&validateKwd)
#define SDDSkwd__(name,value) SDDS(name,value,&validateKwd)
#define DD1_4096(name,value) DD(name,value,&validate1_4096)
#define DD0_18(name,value) DD(name,value,&validate0_18)
#define DD0_64(name,value) DD(name,value,&validate0_64)
#define DD16_64(name,value) DD(name,value,&validate16_64)
#define DDalis_(name,value) DD(name,value,&validateAnsiList)
#define XDDalis_(name,value) XDD(name,value,&validateAnsiList)
#define XDDpos__(name,value) XDD(name,value,&validatePOSTableSizes)
#define SDDpos__(name,value) SDD(name,value,&validatePOSTableSizes)
#define DDpos__(name,value) DD(name,value,&validatePOSTableSizes)
#define DDtp___(name,value) DD(name,value,&validateTraceStr)
#define DDosch_(name,value) DD(name,value,&validateOverrideSchema)
#define SDDosch_(name,value) SDD(name,value,&validateOverrideSchema)
#define DDpsch_(name,value) DD(name,value,&validatePublicSchema)
#define SDDpsch_(name,value) SDD(name,value,&validatePublicSchema)
#define DDrlis_(name,value) DD(name,value,&validateRoleNameList)
#define XDDrlis_(name,value) XDD(name,value,&validateRoleNameList)
#define DDrver_(name,value) DD(name,value,&validateReplIoVersion)
#define XDDMVA__(name,value) XDD(name,value,&validateMVAge)
#define DDusht_(name,value) DD(name,value,&validate_uint16)
const DefaultValidator validateUnknown;
const DefaultValidator validateAnsiName(CASE_SENSITIVE_ANSI); // e.g. 'c.s.tbl'
ValidateCollationList validateCollList(TRUE/*mp-format*/); // list collations
const ValidateInt validateInt; // allows neg, zero, pos ints
const ValidateIntNeg1 validateIntNeg1;// allows -1 to +infinity ints
const ValidateIntNeg1 validateIntNeg2;// allows -1 to +infinity ints
const ValidatePercent validatePct; // allows zero to 100 (integral %age)
const ValidateNumericRange validatePct1_t50(VALID_UINT, 1, (float)50);// allows 1 to 50 (integral %age)
const Validate_0_10485760 validate0_10485760; // allows zero to 10Meg (integer)
const Validate_0_255 validate0_255; // allows zero to 255 (integer)
const Validate_0_200000 validate0_200000; // allows zero to 200000 (integer)
const Validate_1_200000 validate1_200000; // allows 1 to 200000 (integer)
const Validate_30_32000 validate30_32000; // allows 30 to 32000
const Validate_30_246 validate30_246; // allows 30 to 246
const Validate_50_4194303 validate50_4194303; // allows 50 to 4194303 (integer)
const Validate_1_24 validate1_24; // allows 1 to 24 (integer)
const ValidateUInt validateUI; // allows zero and pos
const ValidateUInt1 validateUI1; // allows pos only (>= 1)
const ValidateUInt2 validateUI2(2); // allows pos multiples of 2 only
const ValidateUInt2 validateUI8(8); // pos multiples of 8 only
const ValidateUInt2 validateUI512(512); // pos multiples of 512 only
const ValidateUIntFrom0To5 validateUIntFrom0To5; // integer from 0 to 5
const ValidateUIntFrom1500To4000 validateUIntFrom1500To4000; // integer from 1 to 6
const ValidateUIntFrom1To6 validateUIntFrom1To6; // integer from 1 to 6
const ValidateUIntFrom1To8 validateUIntFrom1To8; // integer from 1 to 8
const ValidateUIntFrom1To10 validateUIntFrom1To10; // integer from 1 to 10
const ValidateUIntFrom2To10 validateUIntFrom2To10; // integer from 2 to 10
const ValidateIPCBuf validateIPCBuf; // for IPC message buffers (DP2 msgs)
const ValidateFlt validateFlt; // allows neg, zero, pos (all nums)
const ValidateFltMin0 validateFlt0; // allows zero and pos
const ValidateFltMinEpsilon validateFltE; // allows pos only (>= epsilon > 0)
const ValidateFltMin1 validateFlt1; // allows pos only (>= 1)
const ValidateSelectivity ValidateSelectivity; // allows 0 to 1 (float)
const ValidateFlt_0_1 validateFlt_0_1; // allows 0 to 1 (float)
const ValidateKeyword validateKwd; // allows relevant keywords only
const Validate_1_4096 validate1_4096; // allows 1 to 4096 (integer) which is max character size supported.
const Validate_0_18 validate0_18; // allows 0 to 18 (integer) because 18 is max precision supported.
const Validate_1_1024 validate1_1024; // allows 1 to 1024 (integer).
const Validate_0_64 validate0_64; // allows 0 to 64 (integer)
const Validate_16_64 validate16_64; // allows 16 to 64 (integer)
const Validate_18_128 validate18_128; // allows 18 to 128 (integer).
const Validate_1_128 validate1_128; // allows 1 to 128 (integer).
// allows ':' separated list of three part ANSI names
const ValidateAnsiList validateAnsiList;
// allows ',' separated list of role names
const ValidateRoleNameList validateRoleNameList;
const ValidatePOSTableSizes validatePOSTableSizes;
const ValidateTraceStr validateTraceStr;
const ValidateOverrideSchema validateOverrideSchema; // check OverrideSchema format
const ValidatePublicSchema validatePublicSchema;
// This high value should be same as default value of REPLICATE_IO_VERSION
const ValidateReplIoVersion validateReplIoVersion(11,17);
const ValidateMVAge validateMVAge;
const Validate_uint16 validate_uint16;
// See the NOTEs above for how to maintain this list!
THREAD_P DefaultDefault defaultDefaults[] = {
DDflt0_(ACCEPTABLE_INPUTESTLOGPROP_ERROR, "0.5"),
SDDint__(AFFINITY_VALUE, "-2"),
// controls the ESP allocation per core.
DDkwd__(AGGRESSIVE_ESP_ALLOCATION_PER_CORE, "OFF"),
// this should be used for testing only. DML should not be executed on
// non-audited tables
DDkwd__(ALLOW_DML_ON_NONAUDITED_TABLE, "OFF"),
// DP2_EXECUTOR_POSITION_SAMPLE method in DP2.
// Valid values are ON, OFF and SYSTEM
// ON => choose DP2_ROW_SAMPLING over row sampling in EID, if sampling % is less than 50.
// OFF => choose EID row sampling over DP2 row sampling regardless of sampling %
// SYSTEM => update stats will choose DP row sampling if sampling % is less than 5.
SDDkwd__(ALLOW_DP2_ROW_SAMPLING, "SYSTEM"),
DDkwd__(ALLOW_FIRSTN_IN_SUBQUERIES, "TRUE"),
// ON/OFF flag to invoke ghost objects from non-licensed process (non-super.super user) who can not use parserflags
DDkwd__(ALLOW_GHOST_OBJECTS, "OFF"),
// This default, if set to ON, will allow Translate nodes (to/from UCS2)
// to be automatically inserted by the Binder if some children of an
// ItemExpr are declared as UCS2 and some are declared as ISO88591.
DDkwd__(ALLOW_IMPLICIT_CHAR_CASTING, "ON"),
// this default, if set to ON, will allow certain incompatible
// assignment, like string to int. The assignment will be done by
// implicitely CASTing one operand to another as long as CAST between
// the two is supported. See binder for details.
DDkwd__(ALLOW_INCOMPATIBLE_ASSIGNMENT, "ON"),
// this default, if set to ON, will allow certain incompatible
// comparisons, like string to int. The comparison will be done by
// implicitely CASTing one operand to another as long as CAST between
// the two is supported. See binder for details.
DDkwd__(ALLOW_INCOMPATIBLE_COMPARISON, "ON"),
// this default, if set to ON, will allow certain incompatible
// comparisons. This includes incompatible comparisons, assignments,
// conversions, UNION, arith, string and case stmts.
// See binder(BindItemExpr.cpp, SynthType.cpp) for details.
DDkwd__(ALLOW_INCOMPATIBLE_OPERATIONS, "ON"),
// if set to 2, the replicateNonKeyVEGPred() mdamkey method
// will try to use inputs to filter out VEG elements that are not
// local to the associated table to minimize predicate replication.
// It is defaulted to 0 (off), as there is some concern that this algoritm
// might produce to few replications, which could lead to incorrect results.
// Setting the Value to 1 will try a simpler optimization
DDui___(ALLOW_INPUT_PRED_REPLICATION_REDUCTION,"0"),
// if set to ON, then isolation level (read committed, etc) could be
// specified in a regular CREATE VIEW (not a create MV) statement.
DDkwd__(ALLOW_ISOLATION_LEVEL_IN_CREATE_VIEW, "ON"),
// if set to ON, then we allow subqueries of degree > 1 in the
// select list.
DDkwd__(ALLOW_MULTIDEGREE_SUBQ_IN_SELECTLIST, "SYSTEM"),
// by default, a primary key or unique constraint must be non-nullable.
// This default, if set, allows them to be nullable.
// The default value is OFF.
DDkwd__(ALLOW_NULLABLE_UNIQUE_KEY_CONSTRAINT, "OFF"),
// if set to ON, then ORDER BY could be
// specified in a regular CREATE VIEW (not a create MV) statement.
DDkwd__(ALLOW_ORDER_BY_IN_CREATE_VIEW, "ON"),
DDkwd__(ALLOW_ORDER_BY_IN_SUBQUERIES, "ON"),
// rand() function in sql is disabled unless this CQD is turned on
DDkwd__(ALLOW_RAND_FUNCTION, "ON"),
DDkwd__(ALLOW_RANGE_PARTITIONING, "TRUE"),
DDkwd__(ALLOW_RENAME_OF_MVF_OR_SUBQ, "OFF"),
DDkwd__(ALLOW_RISKY_UPDATE_WITH_NO_ROLLBACK, "OFF"),
DDkwd__(ALLOW_SUBQ_IN_SET, "SYSTEM"),
DDkwd__(ALLOW_UNEXTERNALIZED_MAINTAIN_OPTIONS, "OFF"),
// Allow users to grant privileges to role using the with grant option
DDkwd__(ALLOW_WGO_FOR_ROLES, "ON"),
DDSkwd__(ALTPRI_ESP, ""),
DDSkwd__(ALTPRI_MASTER, ""),
DDS_____(AQR_ENTRIES, ""),
DDkwd__(AQR_WNR, "ON"),
DDkwd__(AQR_WNR_DELETE_NO_ROWCOUNT, "OFF"),
DDkwd__(AQR_WNR_EXPLAIN_INSERT, "OFF"),
DDkwd__(AQR_WNR_INSERT_CLEANUP, "OFF"),
DDkwd__(AQR_WNR_LOCK_INSERT_TARGET, "OFF"),
DDkwd__(ARKCMP_FAKE_HW, "OFF"),
DDkwd__(ASG_FEATURE, "ON"),
// Set ASM cache
DDkwd__(ASM_ALLOWED, "ON"),
// Precompute statistics in ASM
DDkwd__(ASM_PRECOMPUTE, "OFF"),
DDkwd__(ASYMMETRIC_JOIN_TRANSFORMATION, "MAXIMUM"),
DDkwd__(ATTEMPT_ASYNCHRONOUS_ACCESS, "ON"),
DDkwd__(ATTEMPT_ESP_PARALLELISM, "ON"),
DDkwd__(ATTEMPT_REVERSE_SYNCHRONOUS_ORDER, "ON"),
DDkwd__(AUTOMATIC_RECOMPILATION, "OFF"),
DDkwd__(AUTO_QUERY_RETRY, "SYSTEM"),
XDDkwd__(AUTO_QUERY_RETRY_WARNINGS, "OFF"),
DDkwd__(BASE_NUM_PAS_ON_ACTIVE_PARTS, "OFF"),
DDint__(BEGIN_TRANSACTION_FOR_SELECT, "1"),
// see comments in DefaultConstants.h
DDkwd__(BIGNUM_IO, "SYSTEM"),
DDint__(BLOCK_ENCRYPTION_MODE, "0"),
XDDkwd__(BLOCK_TO_PREVENT_HALLOWEEN, "ON"),
DDflte_(BMO_CITIZENSHIP_FACTOR, "1."),
DDflte_(BMO_MEMORY_EQUAL_QUOTA_SHARE_RATIO, "0.5"),
DDui___(BMO_MEMORY_ESTIMATE_OUTLIER_FACTOR, "10"),
DDflte_(BMO_MEMORY_ESTIMATE_RATIO_CAP, "0.7"),
DDui___(BMO_MEMORY_LIMIT_LOWER_BOUND_HASHGROUPBY , "25"),
DDui___(BMO_MEMORY_LIMIT_LOWER_BOUND_HASHJOIN, "25"),
DDui___(BMO_MEMORY_LIMIT_LOWER_BOUND_SORT , "200"),
XDDui___(BMO_MEMORY_LIMIT_PER_NODE_IN_MB, "10240"),
DDui___(BMO_MEMORY_LIMIT_UPPER_BOUND, "1200"),
DDui1__(BMO_MEMORY_SIZE, "204800"),
// percentage of physical main memory availabe for BMO.
// This value is only used by HJ and HGB to come up with
// an initial estimate for the number of clusters to allocate.
// It does NOT by any means determine the amount of memory
// used by a BMO. The memory usage depends on the amount of
// memory available during execution and the amount of input
// data.
DDflte_(BMO_MEMORY_USAGE_PERCENT, "5."),
// When on, then try to bulk move nullable and variable length column values.
DDkwd__(BULK_MOVE_NULL_VARCHAR, "ON"),
//Temporary fix to bypass volatile schema name checking for non-table objects - ALM Case#4764
DDkwd__(BYPASS_CHECK_FOR_VOLATILE_SCHEMA_NAME, "OFF"),
DDkwd__(CACHE_HISTOGRAMS, "ON"),
DDkwd__(CACHE_HISTOGRAMS_CHECK_FOR_LEAKS, "OFF"),
DD0_200000(CACHE_HISTOGRAMS_IN_KB, "32768"),
DDkwd__(CACHE_HISTOGRAMS_MONITOR_HIST_DETAIL, "OFF"),
DDkwd__(CACHE_HISTOGRAMS_MONITOR_MEM_DETAIL, "OFF"),
DD_____(CACHE_HISTOGRAMS_MONITOR_OUTPUT_FILE, ""),
DD_____(CACHE_HISTOGRAMS_TRACE_OUTPUT_FILE, ""),
DDkwd__(CALL_EMBEDDED_ARKCMP, "OFF"),
DDui___(CANCEL_MINIMUM_BLOCKING_INTERVAL, "60"),
DDkwd__(CANCEL_QUERY_ALLOWED, "ON"), // Make sure it is in sync with SSD
DDkwd__(CASCADED_GROUPBY_TRANSFORMATION, "ON"),
XDDansi_(CATALOG, TRAFODION_SYSCAT_LIT),
DDkwd__(CAT_ALLOW_NEW_FEATUREX, "OFF"),
DDkwd__(CAT_DEFAULT_COMPRESSION, "NONE"),
// Metadata table distribution schemes
// OFF - Place all metadata tables on one single disk
// LOCAL_NODE - Distribute metadata tables across disks on local segment
// where first schema in the catalog is created
// ON - Distribute metadata tables across disks in local segment
// and visible remote segments
SDDkwd__(CAT_DISTRIBUTE_METADATA, "ON"),
//SDDkwd__(CAT_DISTRIBUTE_METADATA, "ON"),
// This disables Query Invalidation processing in catman when set to "OFF"
SDDkwd__(CAT_ENABLE_QUERY_INVALIDATION, "ON"),
// This enables the DB Limits functionality. If set to OFF, then blocksize
// is restricted to 4096 and clustering key size is limited to 255 bytes.
// DB Limits checking is turned off on NT since NT's DP2 does not support
// large blocks or keys.
DDkwd__(CAT_LARGE_BLOCKS_LARGE_KEYS, "ON"),
// Controls how pathnames for routines/procedures/SPJs are interpreted
DDkwd__(CAT_LIBRARY_PATH_RELATIVE, "OFF"),
// CMP_ERR_LOG_FILE indicates where to save a log for certain errors.
DD_____(CMP_ERR_LOG_FILE, "tdm_arkcmp_errors.log"),
DDint__(COMPILER_IDLE_TIMEOUT, "1800"), // To match with set session defaults value
// tracking compilers specific defaults
DDint__(COMPILER_TRACKING_INTERVAL, "0"),
DD_____(COMPILER_TRACKING_LOGFILE, "NONE"),
DDkwd__(COMPILER_TRACKING_LOGTABLE, "OFF"),
DDkwd__(COMPILE_TIME_MONITOR, "OFF"),
DD_____(COMPILE_TIME_MONITOR_LOG_ALLTIME_ONLY, "OFF"),
DD_____(COMPILE_TIME_MONITOR_OUTPUT_FILE, "NONE"),
// Switch between new aligned internal format and exploded format
DDkwd__(COMPRESSED_INTERNAL_FORMAT, "SYSTEM"),
DDkwd__(COMPRESSED_INTERNAL_FORMAT_BMO, "SYSTEM"),
DDkwd__(COMPRESSED_INTERNAL_FORMAT_BMO_AFFINITY, "ON"),
DDkwd__(COMPRESSED_INTERNAL_FORMAT_BULK_MOVE, "ON"),
DDflt0_(COMPRESSED_INTERNAL_FORMAT_DEFRAG_RATIO, "0.30"),
DDkwd__(COMPRESSED_INTERNAL_FORMAT_EXPLAIN, "OFF"),
DDui1__(COMPRESSED_INTERNAL_FORMAT_MIN_ROW_SIZE, "32"),
DDkwd__(COMPRESSED_INTERNAL_FORMAT_ROOT_DOES_CONVERSION, "OFF"),
DDflt0_(COMPRESSED_INTERNAL_FORMAT_ROW_SIZE_ADJ, "0.90"),
XDDkwd__(COMPRESSION_TYPE, "NONE"),
// These are switches and variables to use for compiler debugging
DDkwd__(COMP_BOOL_1, "OFF"),
DDkwd__(COMP_BOOL_100, "OFF"),
DDkwd__(COMP_BOOL_101, "OFF"),
DDkwd__(COMP_BOOL_102, "OFF"),
DDkwd__(COMP_BOOL_103, "OFF"),
DDkwd__(COMP_BOOL_104, "OFF"),
DDkwd__(COMP_BOOL_106, "OFF"),
DDkwd__(COMP_BOOL_107, "ON"), // Being used for testing default predicate synthesis in cardinality estimation
DDkwd__(COMP_BOOL_108, "ON"), // Being used for testing default predicate synthesis in cardinality estimation
DDkwd__(COMP_BOOL_11, "OFF"),
DDkwd__(COMP_BOOL_110, "OFF"),
DDkwd__(COMP_BOOL_111, "OFF"),
DDkwd__(COMP_BOOL_112, "OFF"),
DDkwd__(COMP_BOOL_113, "OFF"),
DDkwd__(COMP_BOOL_114, "ON"), // If set to "OFF", turns off JIRA TRAFODION-3296 fix
DDkwd__(COMP_BOOL_115, "OFF"),
DDkwd__(COMP_BOOL_116, "OFF"),
DDkwd__(COMP_BOOL_117, "OFF"),
DDkwd__(COMP_BOOL_118, "OFF"), // soln 10-100508-0135 - allow undo of fix.
DDkwd__(COMP_BOOL_119, "OFF"),
DDkwd__(COMP_BOOL_12, "OFF"),
DDkwd__(COMP_BOOL_120, "OFF"),
DDkwd__(COMP_BOOL_122, "ON"), // Solution 10-081203-7708 fix
DDkwd__(COMP_BOOL_123, "OFF"),
DDkwd__(COMP_BOOL_124, "OFF"),
DDkwd__(COMP_BOOL_125, "ON"),
DDkwd__(COMP_BOOL_126, "OFF"),
DDkwd__(COMP_BOOL_127, "ON"),
DDkwd__(COMP_BOOL_128, "ON"),
DDkwd__(COMP_BOOL_129, "ON"),
DDkwd__(COMP_BOOL_13, "OFF"),
DDkwd__(COMP_BOOL_130, "ON"),
DDkwd__(COMP_BOOL_131, "OFF"),
DDkwd__(COMP_BOOL_132, "OFF"),
DDkwd__(COMP_BOOL_133, "OFF"),
DDkwd__(COMP_BOOL_134, "ON"),
DDkwd__(COMP_BOOL_135, "ON"),
DDkwd__(COMP_BOOL_136, "OFF"),
DDkwd__(COMP_BOOL_137, "OFF"), // ON enables logging of RewriteJoinPred
DDkwd__(COMP_BOOL_138, "OFF"), // ON disables tryToRewriteJoinPredicate
DDkwd__(COMP_BOOL_139, "OFF"),
DDkwd__(COMP_BOOL_14, "ON"),
DDkwd__(COMP_BOOL_140, "ON"),
DDkwd__(COMP_BOOL_141, "ON"), // Used for testing MC UEC adjustment for uplifting join cardinality
DDkwd__(COMP_BOOL_144, "OFF"), // only Key columns usage as a part of materialization of disjuncts is controlled by the CQD
DDkwd__(COMP_BOOL_145, "ON"), // Used for selectivity adjustment for MC Joins
DDkwd__(COMP_BOOL_147, "OFF"),
DDkwd__(COMP_BOOL_148, "ON"), // Used for GroupBy Cardinality Enhancement for complex expressions
DDkwd__(COMP_BOOL_149, "ON"), // Used for testing multi-col uniqueness cardinality enhancement
DDkwd__(COMP_BOOL_15, "ON"), // If ON, use runtime ROUND for BigNums; if OFF, rewrite ROUND for BigNums in terms of other functions
DDkwd__(COMP_BOOL_150, "OFF"),
DDkwd__(COMP_BOOL_151, "OFF"),
DDkwd__(COMP_BOOL_152, "OFF"),
DDkwd__(COMP_BOOL_153, "ON"), // skew buster: ON == use round robin, else Co-located.
DDkwd__(COMP_BOOL_154, "OFF"),
DDkwd__(COMP_BOOL_155, "OFF"),
DDkwd__(COMP_BOOL_156, "ON"), // Used by RTS to turn on RTS Stats collection for ROOT operators
DDkwd__(COMP_BOOL_158, "ON"), // ON --> allows equijoins on VARCHAR/VARCHAR and CHAR/VARCHAR to be rewritten as VEGPreds
DDkwd__(COMP_BOOL_159, "OFF"),
DDkwd__(COMP_BOOL_160, "OFF"),
DDkwd__(COMP_BOOL_161, "OFF"),
DDkwd__(COMP_BOOL_162, "ON"), // transform NOT EXISTS subquery using anti_semijoin instead of Join-Agg
DDkwd__(COMP_BOOL_163, "OFF"),
DDkwd__(COMP_BOOL_164, "OFF"),
DDkwd__(COMP_BOOL_165, "ON"), // set to 'ON' in M5 for SQ
DDkwd__(COMP_BOOL_166, "OFF"), // ON --> turn off fix for 10-100310-8659.
DDkwd__(COMP_BOOL_167, "OFF"),
DDkwd__(COMP_BOOL_168, "ON"),
DDkwd__(COMP_BOOL_169, "OFF"),
DDkwd__(COMP_BOOL_171, "OFF"),
DDkwd__(COMP_BOOL_172, "OFF"),
DDkwd__(COMP_BOOL_173, "OFF"), // fix: make odbc params nullable
DDkwd__(COMP_BOOL_174, "ON"), // internal usage: merge stmt
DDkwd__(COMP_BOOL_175, "OFF"), // internal usage: merge stmt
DDkwd__(COMP_BOOL_176, "OFF"),
DDkwd__(COMP_BOOL_177, "OFF"),
DDkwd__(COMP_BOOL_178, "OFF"),
DDkwd__(COMP_BOOL_18, "OFF"),
DDkwd__(COMP_BOOL_183, "OFF"),
DDkwd__(COMP_BOOL_184, "ON"), // ON => use min probe size for mdam. Using min probe size of 1 or 2 currently has a bug so this is not the default. OFF => use default probe size of 100
DDkwd__(COMP_BOOL_185, "ON"), //Fix, allows extract(year from current_date) to be treated as a userinput
DDkwd__(COMP_BOOL_186, "OFF"),
DDkwd__(COMP_BOOL_187, "OFF"), // reserved for internal usage
DDkwd__(COMP_BOOL_188, "OFF"),
DDkwd__(COMP_BOOL_189, "OFF"), // reserved for internal usage
DDkwd__(COMP_BOOL_19, "OFF"),
DDkwd__(COMP_BOOL_190, "OFF"),
DDkwd__(COMP_BOOL_191, "OFF"), // Temp for UDF metadata switch
DDkwd__(COMP_BOOL_192, "OFF"),
DDkwd__(COMP_BOOL_193, "OFF"),
DDkwd__(COMP_BOOL_194, "ON"), // If "OFF", turns off JIRA Trafodion 3325 fix
DDkwd__(COMP_BOOL_196, "OFF"),
DDkwd__(COMP_BOOL_197, "OFF"),
DDkwd__(COMP_BOOL_198, "OFF"),
DDkwd__(COMP_BOOL_199, "ON"),
DDkwd__(COMP_BOOL_2, "OFF"),
DDkwd__(COMP_BOOL_20, "OFF"), // ON -> disable ability of stmt to be canceled.
DDkwd__(COMP_BOOL_200, "OFF"),
DDkwd__(COMP_BOOL_201, "OFF"),
DDkwd__(COMP_BOOL_202, "ON"),// For SQ:
// ON: excluding fixup cost
// for EXCHANGE for
// anti-surf logic;
// OFF: do include.
// Change to ON in M5
DDkwd__(COMP_BOOL_203, "OFF"),
DDkwd__(COMP_BOOL_206, "OFF"), // Internal Usage
DDkwd__(COMP_BOOL_207, "OFF"), // Internal Usage
DDkwd__(COMP_BOOL_21, "OFF"),
DDkwd__(COMP_BOOL_210, "ON"),
DDkwd__(COMP_BOOL_211, "ON"), // controls removing constants from group expression
DDkwd__(COMP_BOOL_217, "OFF"),
DDkwd__(COMP_BOOL_219, "OFF"), // for InMem obj defn
DDkwd__(COMP_BOOL_22, "ON"),
DDkwd__(COMP_BOOL_221, "OFF"), // unnests a subquery even when there is no explicit correlation
// bulk replicate features
// bulk replicate features
DDkwd__(COMP_BOOL_226, "OFF"), // ON enables UNLOAD feature
// for disk label stats.
DDkwd__(COMP_BOOL_23, "ON"),
DDkwd__(COMP_BOOL_24, "OFF"), // AS enhancement to adjust maxDoP
DDkwd__(COMP_BOOL_25, "OFF"), // Being used in Cardinality Estimation
DDkwd__(COMP_BOOL_27, "OFF"),
DDkwd__(COMP_BOOL_28, "OFF"),
DDkwd__(COMP_BOOL_29, "OFF"),
DDkwd__(COMP_BOOL_3, "OFF"),
DDkwd__(COMP_BOOL_30, "ON"),
DDkwd__(COMP_BOOL_31, "OFF"),
DDkwd__(COMP_BOOL_32, "OFF"),
DDkwd__(COMP_BOOL_33, "OFF"),
DDkwd__(COMP_BOOL_34, "OFF"),
DDkwd__(COMP_BOOL_35, "OFF"),
DDkwd__(COMP_BOOL_36, "OFF"),
DDkwd__(COMP_BOOL_37, "OFF"),
DDkwd__(COMP_BOOL_38, "OFF"),
DDkwd__(COMP_BOOL_39, "OFF"),
DDkwd__(COMP_BOOL_4, "OFF"),
DDkwd__(COMP_BOOL_40, "ON"),
DDkwd__(COMP_BOOL_41, "OFF"),
DDkwd__(COMP_BOOL_42, "ON"),
DDkwd__(COMP_BOOL_44, "OFF"),
DDkwd__(COMP_BOOL_45, "ON"),
DDkwd__(COMP_BOOL_46, "OFF"),
DDkwd__(COMP_BOOL_47, "ON"),
DDkwd__(COMP_BOOL_48, "ON"), // Turned "Off" because of Regression failure
DDkwd__(COMP_BOOL_49, "OFF"),
DDkwd__(COMP_BOOL_5, "ON"),
DDkwd__(COMP_BOOL_51, "OFF"),
DDkwd__(COMP_BOOL_52, "OFF"),
DDkwd__(COMP_BOOL_53, "ON"), //Turned "ON" for OCB Cost
DDkwd__(COMP_BOOL_54, "OFF"),
DDkwd__(COMP_BOOL_55, "OFF"),
DDkwd__(COMP_BOOL_56, "OFF"),
DDkwd__(COMP_BOOL_57, "ON"),
DDkwd__(COMP_BOOL_59, "OFF"),
// comp_bool_60 is used in costing of an exchange operator. This is
// used in deciding to use Nodemap decoupling and other exchange
// costing logic.
DDkwd__(COMP_BOOL_60, "ON"),
DDkwd__(COMP_BOOL_61, "OFF"),
DDkwd__(COMP_BOOL_62, "OFF"),
DDkwd__(COMP_BOOL_63, "OFF"),
DDkwd__(COMP_BOOL_64, "OFF"),
DDkwd__(COMP_BOOL_65, "OFF"),
DDkwd__(COMP_BOOL_66, "OFF"),
DDkwd__(COMP_BOOL_67, "ON"), // Being used in Cardinality Estimation
DDkwd__(COMP_BOOL_68, "ON"),
DDkwd__(COMP_BOOL_69, "OFF"),
DDkwd__(COMP_BOOL_7, "OFF"),
DDkwd__(COMP_BOOL_70, "ON"),
DDkwd__(COMP_BOOL_71, "OFF"),
DDkwd__(COMP_BOOL_72, "OFF"),
DDkwd__(COMP_BOOL_73, "OFF"),
DDkwd__(COMP_BOOL_74, "ON"),
DDkwd__(COMP_BOOL_75, "ON"),
DDkwd__(COMP_BOOL_76, "ON"),
DDkwd__(COMP_BOOL_77, "OFF"),
DDkwd__(COMP_BOOL_78, "OFF"),
DDkwd__(COMP_BOOL_79, "ON"),
DDkwd__(COMP_BOOL_8, "OFF"),
DDkwd__(COMP_BOOL_80, "OFF"),
DDkwd__(COMP_BOOL_81, "OFF"),
DDkwd__(COMP_BOOL_82, "OFF"),
DDkwd__(COMP_BOOL_83, "ON"),
DDkwd__(COMP_BOOL_84, "OFF"),
DDkwd__(COMP_BOOL_85, "OFF"),
DDkwd__(COMP_BOOL_86, "OFF"),
DDkwd__(COMP_BOOL_87, "OFF"),
DDkwd__(COMP_BOOL_88, "OFF"),
DDkwd__(COMP_BOOL_9, "OFF"),
DDkwd__(COMP_BOOL_90, "ON"),
DDkwd__(COMP_BOOL_91, "OFF"),
DDkwd__(COMP_BOOL_92, "OFF"), // used by generator.
DDkwd__(COMP_BOOL_93, "ON"), // turn on pushdown for IUDs involving MVs. Default is off
DDkwd__(COMP_BOOL_94, "OFF"),
DDkwd__(COMP_BOOL_95, "OFF"),
DDkwd__(COMP_BOOL_96, "OFF"),
DDkwd__(COMP_BOOL_97, "OFF"),
DDkwd__(COMP_BOOL_98, "ON"),
DDkwd__(COMP_BOOL_99, "OFF"),
DDflt0_(COMP_FLOAT_0, "0.002"),
DDflt0_(COMP_FLOAT_1, "0.00002"),
DDflt0_(COMP_FLOAT_2, "0"),
DDflt0_(COMP_FLOAT_3, "0.01"),
DDflt0_(COMP_FLOAT_4, "1.1"),
DDflt__(COMP_FLOAT_5, "0.01"), // For Split Top cost adjustments : 0.25
DDflt__(COMP_FLOAT_6, "0.67"), // used to set the fudge factor which
// is used to estimate cardinality of an
// aggregate function in an equi-join expression
DDflt__(COMP_FLOAT_7, "1.5"),
DDflt__(COMP_FLOAT_8, "0.8"),
// min expected #groups when HGB under right side of NLJ
DDflt__(COMP_FLOAT_9, "1002.0"),
DDint__(COMP_INT_0, "5000"),
DDint__(COMP_INT_10, "3"),
DDint__(COMP_INT_11, "-1"),
DDint__(COMP_INT_14, "0"),
DDint__(COMP_INT_15, "7"),
DDint__(COMP_INT_16, "1000000"),
DDint__(COMP_INT_17, "1000000"),
DDint__(COMP_INT_18, "1"),
DDint__(COMP_INT_19, "2"),
DDint__(COMP_INT_2, "1"),
DDint__(COMP_INT_20, "4"),
DDint__(COMP_INT_21, "0"),
DDint__(COMP_INT_22, "0"), // used to control old parser based INLIST transformation
// 0 ==> OFF, positive value implies ON and has the effect of implicitly shutting down much of OR_PRED transformations
// this cqd has been retained as a fallback in case OR_PRED has bugs.
DDint__(COMP_INT_23, "22"),
DDint__(COMP_INT_24, "1000000000"),
DDint__(COMP_INT_26, "1"),
DDint__(COMP_INT_3, "5"),
DDint__(COMP_INT_30, "5"),
DDint__(COMP_INT_31, "5"),
DDint__(COMP_INT_32, "100"),
DDint__(COMP_INT_34, "10000"), // lower bound: 10000
DDint__(COMP_INT_35, "500000"), // upper bound: 200000
DDint__(COMP_INT_36, "128"), // Bounds for producer for OCB
DDint__(COMP_INT_38, "0"), // test master's abend
DDint__(COMP_INT_39, "0"), // test esp's abend
DDint__(COMP_INT_4, "400"),
DDint__(COMP_INT_40, "10"), // this defines the percentage of selectivity after applying equality predicates on single column histograms
// beyond which the optimizer should use MC stats
DDint__(COMP_INT_43, "3"), // this is only for testing purposes. Once HIST_USE_SAMPLE_FOR_CARDINALITY_ESTIMATION is set to ON by default, the value of this CQD should be adjusted
DDint__(COMP_INT_44, "1000000"), // frequency threshold above which
// a boundary value will be inclded
// in the frequentValueList (stats)
DDint__(COMP_INT_45, "300"),
DDint__(COMP_INT_46, "10"),
DDint__(COMP_INT_47, "0"),
DDint__(COMP_INT_48, "32"), // # trips thru scheduler task list before eval of CPU time limit.
DDint__(COMP_INT_5, "0"),
DDint__(COMP_INT_50, "0"),
DDint__(COMP_INT_51, "0"),
DDint__(COMP_INT_54, "0"),
// comp_int_60 is used in costing of an exchnage operator. It is
// used to indicate buffer size of a DP2 exchange when sending
// messages down.
DDint__(COMP_INT_60, "4"),
DDint__(COMP_INT_61, "0"),
// Exchange operator default value
DDint__(COMP_INT_62, "10000"),
DDint__(COMP_INT_63, "10000"), // SG Insert issue
DDint__(COMP_INT_66, "0"), // to change #buffers per flushed cluster
DDint__(COMP_INT_67, "8"), // to test #outer-buffers per a batch
DDint__(COMP_INT_7, "10000000"),
DDint__(COMP_INT_70, "1000000"),
DDint__(COMP_INT_71, "0"),
// if set to 1, allows keyPredicate to be inserted without passing key col.
DDint__(COMP_INT_73, "1"),
// if set to 1, disables cursor_delete plan if there are no alternate indexes.
DDint__(COMP_INT_74, "0"),
DDint__(COMP_INT_77, "0"),
DDint__(COMP_INT_79, "0"),
// this is used temporaraly as value for parallel threshold
// in case ATTEMPT_ESP_PARALLELISM is set to MAXIMUM
DDint__(COMP_INT_8, "20"),
DDint__(COMP_INT_80, "3"),
DDint__(COMP_INT_89, "2"),
DDint__(COMP_INT_9, "0"),
DDint__(COMP_INT_90, "0"),
DDint__(COMP_INT_95, "0"),
DDint__(COMP_INT_98, "512"),
DDint__(COMP_INT_99, "10"),
DD_____(COMP_STRING_1, "NONE"),
DD_____(COMP_STRING_2, ""),
DD_____(COMP_STRING_5, ""),
DDkwd__(CONSTANT_FOLDING, "OFF"),
DDkwd__(COSTING_SHORTCUT_GROUPBY_FIX, "ON"),
DDflt0_(COST_PROBE_DENSITY_THRESHOLD, ".25"),
DDflt0_(CPUCOST_COMPARE_COMPLEX_DATA_TYPE_OVERHEAD, "10."),
DDflt0_(CPUCOST_COMPARE_COMPLEX_DATA_TYPE_PER_BYTE, ".1"),
// Same as CPUCOST_PREDICATE_COMPARISON
// Change HH_OP_PROBE_HASH_TABLE when you change this value:
DDflt0_(CPUCOST_COMPARE_SIMPLE_DATA_TYPE, ".200"),
// no cost overhead assumed:
DDflt0_(CPUCOST_COPY_ROW_OVERHEAD, "0."),
// change CPUCOST_HASH_PER_KEY when changing this value
DDflt0_(CPUCOST_COPY_ROW_PER_BYTE, ".0007"),
DDflt0_(CPUCOST_COPY_SIMPLE_DATA_TYPE, ".005"),
// This is a per data request overhead cost paid by the cpu
DDflt0_(CPUCOST_DATARQST_OVHD, ".01"),
DDflt0_(CPUCOST_ENCODE_PER_BYTE, ".002"),
DDflt0_(CPUCOST_ESP_INITIALIZATION, "10"),
// The previous observation had calculated the number of seconds to
// aggregate incorrectly. Now:
// Number of seconds to scan 100,000 rows @ 208 bytes: 4
// Number of seconds to scan 100,000 rows @ 208 bytes and aggregate
// 15 aggregates: 17
// Thus, number of seconds per aggregate = (17-4)/15 = 0.866667
// CPUCOST_PER_ROW = 1.13333/(0.00005*100,000) = 0.1733
// previous observation
// It takes 13.96 seconds to aggregate 99,999 rows using
// 15 expressions, thus at 0.00005 et_cpu, we have that
// the cost to eval an arith op is:
// 6.14 / (0.00005 * 99,9999 * 15) = 0.0819
DDflt0_(CPUCOST_EVAL_ARITH_OP, ".0305"),
DDflt0_(CPUCOST_EVAL_FUNC_DEFAULT, "10."),
DDflt0_(CPUCOST_EVAL_SIMPLE_PREDICATE, "1."),
DDflt0_(CPUCOST_EXCHANGE_COST_PER_BYTE, ".002"),
DDflt0_(CPUCOST_EXCHANGE_INTERNODE_COST_PER_BYTE, ".008"),
// was 0.1, but now 0.011
// XDDflt0_(CPUCOST_EXCHANGE_REMOTENODE_COST_PER_BYTE, ".011"),
// Set the additional cost of copying a byte to message buffer for
// remote node to be the same as for inter node, 0.01
// Also change it to be internalized
DDflt0_(CPUCOST_EXCHANGE_REMOTENODE_COST_PER_BYTE, ".01"),
// Assume
// CPUCOST_HASH_PER_KEY = 4 * CPUCOST_HASH_PER_BYTE
// History:
// Before 01/06/98: 0.005
DDflt0_(CPUCOST_HASH_PER_BYTE, ".057325"),
// Assume
// CPUCOST_HASH_PER_KEY = 4 * CPUCOST_HASH_PER_BYTE
// From observation:
// For a case when all the hash table fits into memory:
// 01/05/98: 42,105 rows inserted per second @ 0.00005 seconds
// per thousand of instructions, give:
// seconds to insert one row = 1/42105 = 0.00002375
// thd. of instructions per row inserted = 1/42105/0.00005 = 0.4750
// The cost is distributed as follows:
// CPUCOST_HASH_PER_KEY + CPUCOST_HASH_PER_BYTE*4 +
// HH_OP_INSERT_ROW_TO_CHAIN + CPUCOST_COPY_ROW_PER_BYTE * 4
// = 0.4750
// Thus we have:
// 2* CPUCOST_HASH_PER_KEY + 0.01 + 0.0016*4 = 0.4750
// -> CPUCOST_HASH_PER_KEY = 0.4586/2 = 0.2293
// History:
// Before 01/06/98: 0.02
// Change
// CPUCOST_HASH_PER_BYTE
// when changing this value
DDflt0_(CPUCOST_HASH_PER_KEY, "1.29"),
DDflt0_(CPUCOST_LIKE_COMPARE_OVERHEAD, "10."),
DDflt0_(CPUCOST_LIKE_COMPARE_PER_BYTE, ".1"),
DDflt0_(CPUCOST_LOCK_ROW, ".01"),
DDflt0_(CPUCOST_NJ_TUPLST_FF, "10."),
// Observation (A971125_1):
// CPU time to scan 100,000 rows with no exe pred: 10
// CPU time to scan 100,000 rows with an exe pred like
// nonkeycol < K: 11
// CPU time spend in every row: 1/100,000 = .00001
// Thus, at 0.00005 th. inst. per sec we have: 0.00001/0.00005 =
// 0.2 thousand inst. to evaluate every row:
//
// Predicate comparison is very expensive right now (10/08/97)
// (cost it that it takes like 1000 instruction for one comparison)
// 10/08/97: 1.
// Change
// CPUCOST_COMPARE_SIMPLE_DATA_TYPE
// when you change this value:
// History
// Before 04/30/98: .2
DDflt0_(CPUCOST_PREDICATE_COMPARISON, ".08"),
// Cost of copying the data from disk to the DP2 Cache:
DDflt0_(CPUCOST_SCAN_DSK_TO_DP2_PER_KB, "2.5"),
DDflt0_(CPUCOST_SCAN_DSK_TO_DP2_PER_SEEK, "0.0"),
// The communication between DP2 and ExeInDp2 requires to encode
// and decode the key.
DDflt0_(CPUCOST_SCAN_KEY_LENGTH, "0."),
// The communication between DP2 and ExeInDp2 is complex and
// ever changing. The following factor is introduced to
// make the costing of scan fit observed CPU time for the scan:
DDflt0_(CPUCOST_SCAN_OVH_PER_KB, "0.984215"),
DDflt0_(CPUCOST_SCAN_OVH_PER_ROW, "0.0"),
// It takes about 1/3 of a second to open a table, thus with a
// 0.00005 ff for cpu elapsed time we get:
// 1/3/0.00005 = 7000 thousands instructions
// CPUCOST_SUBSET_OPEN lumps together all the overhead needed
// to set-up the access to each partition. Thus it is a blocking
// cost, nothing can overlap with it.
DDflt0_(CPUCOST_SUBSET_OPEN, "7000"),
DDflt0_(CPUCOST_SUBSET_OPEN_AFTER_FIRST, "1250"),
DDkwd__(CREATE_OBJECTS_IN_METADATA_ONLY, "OFF"),
DDkwd__(CROSS_PRODUCT_CONTROL, "ON"),
// CQDs for Common Subexpressions (CSEs)
// cache queries containing temp tables for common subexpressions
DDkwd__(CSE_CACHE_TEMP_QUERIES, "OFF"),
// "cleanup obsolete volatile tables" command cleans up Hive temp tables
DDkwd__(CSE_CLEANUP_HIVE_TABLES, "OFF"),
// don't temp if all consumers have preds on n key columns
DDui___(CSE_COMMON_KEY_PRED_CONTROL, "1"),
// emit warnings that help diagnose why CSEs are not shared
DDkwd__(CSE_DEBUG_WARNINGS, "OFF"),
// create a CommonSubExpr node for CTEs defined in WITH clauses (OFF/ON)
DDkwd__(CSE_FOR_WITH, "OFF"),
// use Hive tables as temp tables
DDkwd__(CSE_HIVE_TEMP_TABLE, "ON"),
// don't temp if avg consumer has preds on more than n percent of key cols
DDflt0_(CSE_PCT_KEY_COL_PRED_CONTROL, "49.9"),
// print debugging info on stdout
DDkwd__(CSE_PRINT_DEBUG_INFO, "OFF"),
// limit temp table size (based on max. card and regular card)
DDflt0_(CSE_TEMP_TABLE_MAX_MAX_SIZE, "1E12"),
DDflt0_(CSE_TEMP_TABLE_MAX_SIZE, "1E9"),
// implement CommonSubExpr as a temp table (OFF/SYSTEM/ON)
DDkwd__(CSE_USE_TEMP, "SYSTEM"),
SDDui___(CYCLIC_ESP_PLACEMENT, "1"),
// if this one is "ON" it overwrites optimizer heuristics 4 & 5 as "ON"
// if it's "OFF" then the defaults of the two heuristics will be used
DDkwd__(DATA_FLOW_OPTIMIZATION, "ON"),
DDkwd__(DDL_EXPLAIN, "OFF"),
DDkwd__(DDL_TRANSACTIONS, "ON"),
SDDkwd__(DEFAULT_CHARSET, (char *)SQLCHARSETSTRING_ISO88591),
XDDui1__(DEFAULT_DEGREE_OF_PARALLELISM, "2"),
SDDkwd__(DEFAULT_SCHEMA_ACCESS_ONLY, "OFF"),
SDDkwd__(DEFAULT_SCHEMA_NAMETYPE, "SYSTEM"),
// These DEF_xxx values of "" get filled in by updateSystemParameters().
#define def_DEF_CHUNK_SIZE 5000000.0
#define str_DEF_CHUNK_SIZE "5000000.0"
//
DDui2__(DEF_CHUNK_SIZE, str_DEF_CHUNK_SIZE),
DD_____(DEF_CPU_ARCHITECTURE, ""),
DDui1__(DEF_DISCS_ON_CLUSTER, ""),
DDui1__(DEF_INSTRUCTIONS_SECOND, ""),
DDui___(DEF_LOCAL_CLUSTER_NUMBER, ""),
DDui___(DEF_LOCAL_SMP_NODE_NUMBER, ""),
//DEF_MAX_HISTORY_ROWS made external RV 06/21/01 CR 10-010425-2440
XDDui1__(DEF_MAX_HISTORY_ROWS, "1024"),
DDui___(DEF_NUM_BM_CHUNKS, ""),
DDui1__(DEF_NUM_NODES_IN_ACTIVE_CLUSTERS, ""),
DDui1__(DEF_NUM_SMP_CPUS, ""),
DDui2__(DEF_PAGE_SIZE, ""),
DDui1__(DEF_PHYSICAL_MEMORY_AVAILABLE, ""),
DDui1__(DEF_TOTAL_MEMORY_AVAILABLE, ""),
DDui1__(DEF_VIRTUAL_MEMORY_AVAILABLE, ""),
DDkwd__(DESTROY_ORDER_AFTER_REPARTITIONING, "OFF"),
// detailed executor statistics
DDkwd__(DETAILED_STATISTICS, "OPERATOR"),
DDkwd__(DIMENSIONAL_QUERY_OPTIMIZATION, "OFF"),
DDkwd__(DISABLE_BUFFERED_INSERTS, "OFF"),
DDkwd__(DISABLE_READ_ONLY, "OFF"),
DD_____(DISPLAY_DATA_FLOW_GRAPH, "OFF"),
XDDkwd__(DISPLAY_DIVISION_BY_COLUMNS, "OFF"),
// temp. disable dop reduction logic
DDflt0_(DOP_REDUCTION_ROWCOUNT_THRESHOLD, "0.0"),
// DP2 Cache defaults as of 06/08/98.
DDui1__(DP2_CACHE_1024_BLOCKS, "152"),
DDui1__(DP2_CACHE_16K_BLOCKS, "1024"),
DDui1__(DP2_CACHE_2048_BLOCKS, "150"),
DDui1__(DP2_CACHE_32K_BLOCKS, "512"),
DDui1__(DP2_CACHE_4096_BLOCKS, "4096"),
DDui1__(DP2_CACHE_512_BLOCKS, "152"),
DDui1__(DP2_CACHE_8K_BLOCKS, "2048"),
// Exchange Costing
// 6/12/98.
// End of buffer header is 32 bytes or .0313 KB.
// Each Exchange->DP2 request is 48 bytes or .0469 KB.
DDflte_(DP2_END_OF_BUFFER_HEADER_SIZE, ".0313"),
DDflte_(DP2_EXCHANGE_REQUEST_SIZE, ".0469"),
DDui2__(DP2_MAX_READ_PER_ACCESS_IN_KB, "256"),
// The buffer size, as of 10/07/97 is 32K
DDui2__(DP2_MESSAGE_BUFFER_SIZE, "56"),
// Exchange Costing
// 6/12/98.
// Message header for Exchange->DP2 is 18 bytes or .0176 KB
DDflte_(DP2_MESSAGE_HEADER_SIZE, ".0176"),
DDui2__(DP2_MESSAGE_HEADER_SIZE_BYTES, "18"),
DDui1__(DP2_MINIMUM_FILE_SIZE_FOR_SEEK_IN_BLOCKS, "256"),
DDui1__(DP2_SEQ_READS_WITHOUT_SEEKS, "100"),
DDkwd__(DYNAMIC_HISTOGRAM_COMPRESSION, "ON"),
DDui2__(DYN_PA_QUEUE_RESIZE_INIT_DOWN, "1024"),
DDui2__(DYN_PA_QUEUE_RESIZE_INIT_UP, "1024"),
DDui2__(DYN_QUEUE_RESIZE_FACTOR, "4"),
DDui2__(DYN_QUEUE_RESIZE_INIT_DOWN, "4"),
DDui2__(DYN_QUEUE_RESIZE_INIT_UP, "4"),
DDui1__(DYN_QUEUE_RESIZE_LIMIT, "9"),
DDkwd__(DYN_QUEUE_RESIZE_OVERRIDE, "OFF"),
DDkwd__(EID_SPACE_USAGE_OPT, "OFF"),
DDkwd__(ELIMINATE_REDUNDANT_JOINS, "ON"),
DDSint__(ESP_ASSIGN_DEPTH, "0"),
DDSint__(ESP_FIXUP_PRIORITY_DELTA, "0"),
DDint__(ESP_IDLE_TIMEOUT, "1800"), // To match with set session defaults value
DDkwd__(ESP_MULTI_FRAGMENTS, "ON"),
DDui1500_4000(ESP_MULTI_FRAGMENT_QUOTA_VM, "4000"),
DDui1_8(ESP_NUM_FRAGMENTS, "3"),
DDSint__(ESP_PRIORITY, "0"),
DDSint__(ESP_PRIORITY_DELTA, "0"),
// Disable hints - if SYSTEM, enable on SSD, and disable only on HDD
DDkwd__(EXE_BMO_DISABLE_CMP_HINTS_OVERFLOW_HASH, "SYSTEM"),
DDkwd__(EXE_BMO_DISABLE_CMP_HINTS_OVERFLOW_SORT, "SYSTEM"),
DDkwd__(EXE_BMO_DISABLE_OVERFLOW, "OFF"),
DDui___(EXE_BMO_MIN_SIZE_BEFORE_PRESSURE_CHECK_IN_MB, "50"),
DDkwd__(EXE_BMO_SET_BUFFERED_WRITES, "OFF"),
SDDkwd__(EXE_DIAGNOSTIC_EVENTS, "OFF"),
DDui1__(EXE_HGB_INITIAL_HT_SIZE, "262144"), // == hash buffer
DDflt__(EXE_HJ_MIN_NUM_CLUSTERS, "4"),
DDkwd__(EXE_LOG_RETRY_IPC, "OFF"),
// Total size of memory (in MB) available to BMOs (e.g., 1200 MB)
SDDui___(EXE_MEMORY_AVAILABLE_IN_MB, "1200"),
SDDui___(EXE_MEMORY_FOR_PARTIALHGB_IN_MB, "100"),
SDDui___(EXE_MEMORY_FOR_PROBE_CACHE_IN_MB, "100"),
SDDui___(EXE_MEMORY_FOR_UNPACK_ROWS_IN_MB, "1024"),
// lower-bound memory limit for BMOs/nbmos (in MB)
DDui___(EXE_MEMORY_LIMIT_LOWER_BOUND_EXCHANGE, "10"),
DDui___(EXE_MEMORY_LIMIT_LOWER_BOUND_MERGEJOIN, "10"),
DDui___(EXE_MEMORY_LIMIT_LOWER_BOUND_SEQUENCE , "10"),
// Override the memory quota system; set limit per each and every BMO
SDDflt__(EXE_MEM_LIMIT_PER_BMO_IN_MB, "0"),
DDui1__(EXE_NUM_CONCURRENT_SCRATCH_IOS, "4"), //
DDkwd__(EXE_PARALLEL_DDL, "ON"),
DDkwd__(EXE_SINGLE_BMO_QUOTA, "ON"),
// The following 3 are only for testing overflow; zero value means: ignore
DDui___(EXE_TEST_FORCE_CLUSTER_SPLIT_AFTER_MB, "0"),
DDui___(EXE_TEST_FORCE_HASH_LOOP_AFTER_NUM_BUFFERS, "0"),
DDui___(EXE_TEST_HASH_FORCE_OVERFLOW_EVERY, "0"),
DDkwd__(EXE_UTIL_RWRS, "OFF"),
DDkwd__(EXPAND_DP2_SHORT_ROWS, "ON"),
XDDint__(EXPLAIN_DESCRIPTION_COLUMN_SIZE, "-1"),
DDkwd__(EXPLAIN_DETAIL_COST_FOR_CALIBRATION, "FALSE"),
DDkwd__(EXPLAIN_DISPLAY_FORMAT, "EXTERNAL"),
DDkwd__(EXPLAIN_IN_RMS, "OFF"),
DDkwd__(EXPLAIN_OPTION_C, "OFF"),
DDui___(EXPLAIN_OUTPUT_ROW_SIZE, "80"),
DDui1__(EXPLAIN_ROOT_INPUT_VARS_MAX, "2000"), // maximum number of inputs that we can tolerate to
// explain information for inputVars expression
// this is needed to avoid stack overflow
DDkwd__(EXPLAIN_SPACE_OPT, "ON"),
DDkwd__(EXPLAIN_STRATEGIZER_PARAMETERS, "OFF"),
// Calibration
// 01/23/98: 50.
// Original: .1
DDflte_(EX_OP_ALLOCATE_BUFFER, "50."),
DDflte_(EX_OP_ALLOCATE_BUFFER_POOL, ".1"),
DDflte_(EX_OP_ALLOCATE_TUPLE, ".05"),
// copy_atp affects the costing of NJ
// History:
// 08/21/98: 0.02, The previous change affected more than one operrator
// 08/13/98: 1.0
// 01/08/98: 0.02
DDflte_(EX_OP_COPY_ATP, "1.1335"),
DDkwd__(FAKE_VOLUME_ASSIGNMENTS, "OFF"),
DDui1__(FAKE_VOLUME_NUM_VOLUMES, "24"),
// upper and lower limit (2,10) must be in sync with error values in
//ExFastTransport.cpp
DDkwd__(FAST_EXTRACT_DIAGS, "OFF"),
DDui2_10(FAST_EXTRACT_IO_BUFFERS, "6"),
DDui___(FAST_EXTRACT_IO_TIMEOUT_SEC, "60"),
DDkwd__(FIND_COMMON_SUBEXPRS_IN_OR, "ON"),
DDui___(FLOAT_ESP_RANDOM_NUM_SEED, "0"),
DDkwd__(FORCE_BUSHY_CQS, "ON"),
DDkwd__(FORCE_PARALLEL_INSERT_SELECT, "OFF"),
DDkwd__(FORCE_PASS_ONE, "OFF"),
DDkwd__(FORCE_PASS_TWO, "ON"),
// Control if plan fragments need to be compressed
//
DDui___(FRAG_COMPRESSION_THRESHOLD, "16"),
// Controls FSO Tests for debug
//
DDui___(FSO_RUN_TESTS, "0"),
// Controls use of Simple File Scan Optimizer
// IF 0 - Use original "Complex" File Scan Optimizer.
// (in case simple causes problems)
// IF 1 - Use logic to determine FSO to use. (default)
// IF 2 - Use logic to determine FSO to use, but also use new
// executor predicate costing.
// IF >2 - Always use new "Simple" File Scan Optimizer.
// (not recommended)
//
DDui___(FSO_TO_USE, "1"),
// Disallow/Allow full outer joins in MultiJoin framework
DDkwd__(FULL_OUTER_JOINS_SPOIL_JBB, "OFF"),
DDkwd__(GA_PROP_INDEXES_ARITY_1, "ON"),
// this default value is filled in
// NADefaults::initCurrentDefaultsWithDefaultDefaults. The default value
// is ON for static compiles and OFF for dynamic queries.
DDkwd__(GENERATE_EXPLAIN, "ON"),
DDui___(GEN_CS_BUFFER_SIZE, "0"),
DDui___(GEN_CS_NUM_BUFFERS, "0"),
DDui___(GEN_CS_SIZE_DOWN, "4"),
DDui___(GEN_CS_SIZE_UP, "4"),
DDkwd__(GEN_DBLIMITS_LARGER_BUFSIZE, "ON"),
DDui1__(GEN_DDL_BUFFER_SIZE, "30000"),
DDui1__(GEN_DDL_NUM_BUFFERS, "4"),
DDui1__(GEN_DDL_SIZE_DOWN, "2"),
DDui1__(GEN_DDL_SIZE_UP, "32"),
DDui1__(GEN_DESC_BUFFER_SIZE, "10240"),
DDui1__(GEN_DESC_NUM_BUFFERS, "4"),
DDui1__(GEN_DESC_SIZE_DOWN, "2"),
DDui1__(GEN_DESC_SIZE_UP, "16"),
DDui1__(GEN_DP2I_BUFFER_SIZE, "10000"),
DDui1__(GEN_DP2I_NUM_BUFFERS, "2"),
DDui1__(GEN_DP2I_SIZE_DOWN, "32"),
DDui1__(GEN_DP2I_SIZE_UP, "64"),
DDui1__(GEN_DPSO_BUFFER_SIZE, "10240"),
DDui1__(GEN_DPSO_SIZE_DOWN, "2048"),
DDui1__(GEN_DPSO_SIZE_UP, "2048"),
DDui1__(GEN_DPUO_NUM_BUFFERS, "4"),
DDint__(GEN_EXCHANGE_MAX_MEM_IN_KB, "4000"),
DDint__(GEN_EXCHANGE_MSG_COUNT, "80"),
// Fast extract settings are for UDR method invocations
DDui1__(GEN_FE_BUFFER_SIZE, "31000"),
DDui1__(GEN_FE_NUM_BUFFERS, "2"),
DDui1__(GEN_FE_SIZE_DOWN, "4"),
DDui1__(GEN_FE_SIZE_UP, "4"),
// Do not alter the buffer size; it must be 56K for SCRATCH_MGMT_OPTION == 5
DDui1__(GEN_HGBY_BUFFER_SIZE, "262144"),
DDui1__(GEN_HGBY_NUM_BUFFERS , "5"),
DDui1__(GEN_HGBY_PARTIAL_GROUP_FLUSH_THRESHOLD, "100"),
DDui___(GEN_HGBY_PARTIAL_GROUP_ROWS_PER_CLUSTER, "0"),
DDui1__(GEN_HGBY_SIZE_DOWN, "2048"),
DDui1__(GEN_HGBY_SIZE_UP, "2048"),
// Do not alter the buffer size; it must be 56K for SCRATCH_MGMT_OPTION == 5
DDui1__(GEN_HSHJ_BUFFER_SIZE, "262144"),
// Controls use of the hash join min/max optimization.
DDkwd__(GEN_HSHJ_MIN_MAX_OPT, "OFF"),
DDui1__(GEN_HSHJ_NUM_BUFFERS, "1"),
DDui1__(GEN_HSHJ_SIZE_DOWN, "2048"),
DDui1__(GEN_HSHJ_SIZE_UP, "2048"),
// Controls LeanEr Expression generation
DDkwd__(GEN_LEANER_EXPRESSIONS, "ON"),
DDui1__(GEN_MEM_PRESSURE_THRESHOLD, "10000"),
DDui1__(GEN_MJ_BUFFER_SIZE, "32768"),
DDui1__(GEN_MJ_NUM_BUFFERS, "1"),
DDui1__(GEN_MJ_SIZE_DOWN, "2"),
DDui1__(GEN_MJ_SIZE_UP, "2048"),
DDui1__(GEN_ONLJ_BUFFER_SIZE, "5120"),
DDui1__(GEN_ONLJ_LEFT_CHILD_QUEUE_DOWN, "4"),
DDui1__(GEN_ONLJ_LEFT_CHILD_QUEUE_UP, "2048"),
DDui1__(GEN_ONLJ_NUM_BUFFERS, "5"),
DDui1__(GEN_ONLJ_RIGHT_SIDE_QUEUE_DOWN, "2048"),
DDui1__(GEN_ONLJ_RIGHT_SIDE_QUEUE_UP, "2048"),
DDkwd__(GEN_ONLJ_SET_QUEUE_LEFT, "ON"),
DDkwd__(GEN_ONLJ_SET_QUEUE_RIGHT, "ON"),
DDui1__(GEN_ONLJ_SIZE_DOWN, "2048"),
DDui1__(GEN_ONLJ_SIZE_UP, "2048"),
DDipcBu(GEN_PA_BUFFER_SIZE, "31000"),
DDui1__(GEN_PA_NUM_BUFFERS, "5"),
DDui1__(GEN_PROBE_CACHE_NUM_ENTRIES, "16384"),// number of entries
DDui___(GEN_PROBE_CACHE_NUM_INNER, "0"), //0 means compiler decides
DDui1__(GEN_PROBE_CACHE_SIZE_DOWN, "2048"),
DDui1__(GEN_PROBE_CACHE_SIZE_UP, "2048"),
DDui1__(GEN_SAMPLE_SIZE_DOWN, "16"),
DDui1__(GEN_SAMPLE_SIZE_UP, "16"),
DDui1__(GEN_SEQFUNC_BUFFER_SIZE, "10240"),
DDui1__(GEN_SEQFUNC_NUM_BUFFERS, "10"),
DDui1__(GEN_SEQFUNC_SIZE_DOWN, "512"),
DDui1__(GEN_SEQFUNC_SIZE_UP, "2048"),
DDui1__(GEN_SGBY_BUFFER_SIZE, "5120"),
DDui1__(GEN_SGBY_NUM_BUFFERS, "5"),
DDui1__(GEN_SGBY_SIZE_DOWN, "2048"),
DDui1__(GEN_SGBY_SIZE_UP, "2048"),
DDui1__(GEN_SID_BUFFER_SIZE, "1024"),
DDui1__(GEN_SID_NUM_BUFFERS, "4"),
DDui1__(GEN_SNDB_NUM_BUFFERS, "4"),
DDui1__(GEN_SNDB_SIZE_DOWN, "4"),
DDui1__(GEN_SNDB_SIZE_UP, "128"),
DDui___(GEN_SNDT_BUFFER_SIZE_DOWN, "0"),
DDui___(GEN_SNDT_BUFFER_SIZE_UP, "0"),
DDui1__(GEN_SNDT_NUM_BUFFERS, "2"),
DDkwd__(GEN_SNDT_RESTRICT_SEND_BUFFERS, "ON"),
DDui1__(GEN_SNDT_SIZE_DOWN, "4"),
DDui1__(GEN_SNDT_SIZE_UP, "128"),
DDui1__(GEN_SORT_MAX_BUFFER_SIZE, "5242880"),
DDui1__(GEN_SORT_MAX_NUM_BUFFERS, "160"),
DDui1__(GEN_SORT_NUM_BUFFERS, "2"),
DDui1__(GEN_SORT_SIZE_DOWN, "8"),
DDui1__(GEN_SORT_SIZE_UP, "1024"),
DDkwd__(GEN_SORT_TOPN, "ON"),
DDui1__(GEN_SORT_TOPN_THRESHOLD, "10000"),
DDui1__(GEN_SPLT_SIZE_UP, "2048"),
DDui1__(GEN_TFLO_BUFFER_SIZE, "5120"),
DDui1__(GEN_TFLO_NUM_BUFFERS, "2"),
DDui1__(GEN_TFLO_SIZE_DOWN, "8"),
DDui1__(GEN_TFLO_SIZE_UP, "16"),
DDui512(GEN_TIMEOUT_BUFFER_SIZE, "4096"),
DDui1__(GEN_TIMEOUT_NUM_BUFFERS, "1"),
DDui2__(GEN_TIMEOUT_SIZE_DOWN, "2"),
DDui2__(GEN_TIMEOUT_SIZE_UP, "4"),
DDui1__(GEN_TRAN_BUFFER_SIZE, "4096"),
DDui1__(GEN_TRAN_NUM_BUFFERS, "1"),
DDui1__(GEN_TRAN_SIZE_DOWN, "2"),
DDui1__(GEN_TRAN_SIZE_UP, "4"),
DDui1__(GEN_TRSP_BUFFER_SIZE, "10240"),
DDui1__(GEN_TRSP_NUM_BUFFERS, "5"),
DDui1__(GEN_TRSP_SIZE_DOWN, "2048"),
DDui1__(GEN_TRSP_SIZE_UP, "2048"),
DDui1__(GEN_TUPL_BUFFER_SIZE, "1024"),
DDui1__(GEN_TUPL_NUM_BUFFERS, "4"),
DDui1__(GEN_TUPL_SIZE_DOWN, "2048"),
DDui1__(GEN_TUPL_SIZE_UP, "2048"),
// GEN_UDRRS_ settings are for stored procedure result
// set proxy plans
DDui1__(GEN_UDRRS_BUFFER_SIZE, "31000"),
DDui1__(GEN_UDRRS_NUM_BUFFERS, "2"),
DDui1__(GEN_UDRRS_SIZE_DOWN, "4"),
DDui1__(GEN_UDRRS_SIZE_UP, "128"),
// GEN_UDR_ settings are for UDR method invocations
DDui1__(GEN_UDR_BUFFER_SIZE, "31000"),
DDui1__(GEN_UDR_NUM_BUFFERS, "2"),
DDui1__(GEN_UDR_SIZE_DOWN, "4"),
DDui1__(GEN_UDR_SIZE_UP, "4"),
DDui1__(GEN_UN_BUFFER_SIZE, "10240"),
DDui1__(GEN_UN_NUM_BUFFERS, "5"),
DDui1__(GEN_UN_SIZE_DOWN, "2048"),
DDui1__(GEN_UN_SIZE_UP, "2048"),
// When less or equal to this CQD (5000 rows by default), a partial root
// will be running in the Master. Set to 0 to disable the feature.
DDint__(GROUP_BY_PARTIAL_ROOT_THRESHOLD, "5000"),
DDkwd__(GROUP_BY_PUSH_TO_BOTH_SIDES_OF_JOIN, "ON"),
DDkwd__(GROUP_OR_ORDER_BY_EXPR, "ON"),
// HASH_JOINS ON means do HASH_JOINS
XDDkwd__(HASH_JOINS, "ON"),
// HBase defaults
// Some of the more important ones:
// HBASE_CATALOG: Catalog of "_ROW_" and "_CELL_" schemas
// HBASE_COPROCESSORS: Enable use of co-processors for aggregates.
// need to set the coprocessor in HBase config file
// HBASE_ESTIMATE_ROW_COUNT_VIA_COPROCESSOR: If ON, use a coprocessor when
// estimating row counts; if OFF, use client side
// code (the latter doesn't work if HBase encryption
// is being used)
// HBASE_INTERFACE: JNI or JNI_TRX (transactional interface)
// HBASE_MAX_COLUMN_xxx_LENGTH: Max length of some
// string columns in the "_ROW_" and "_CELL_" schemas
// HBASE_SQL_IUD_SEMANTICS: Off: Don't check for existing rows for insert/update
DDkwd__(HBASE_ASYNC_DROP_TABLE, "OFF"),
DDkwd__(HBASE_ASYNC_OPERATIONS, "ON"),
// HBASE_CACHE_BLOCKS, ON => cache every scan, OFF => cache no scan
// SYSTEM => cache scans which take less than 1 RS block cache mem.
DDui___(HBASE_BLOCK_SIZE, "65536"),
DDkwd__(HBASE_CACHE_BLOCKS, "SYSTEM"),
DD_____(HBASE_CATALOG, "HBASE"),
DDkwd__(HBASE_CHECK_AND_UPDEL_OPT, "ON"),
DDkwd__(HBASE_COMPRESSION_OPTION, ""),
DDkwd__(HBASE_COPROCESSORS, "ON"),
DDkwd__(HBASE_DATA_BLOCK_ENCODING_OPTION, ""),
// If set to 'OFF' we get a stub cost of 1 for delete operations.
// We can remove this once the delete costing code has broader
// exposure.
DDkwd__(HBASE_DELETE_COSTING, "ON"),
DDflt0_(HBASE_DOP_PARALLEL_SCANNER, "0."),
DDkwd__(HBASE_ESTIMATE_ROW_COUNT_VIA_COPROCESSOR, "OFF"),
DDkwd__(HBASE_FILTER_PREDS, "OFF"),
DDkwd__(HBASE_HASH2_PARTITIONING, "ON"),
DDui___(HBASE_INDEX_LEVEL, "0"),
DDui___(HBASE_MAX_COLUMN_INFO_LENGTH, "10000"),
DDui___(HBASE_MAX_COLUMN_NAME_LENGTH, "100"),
DDui___(HBASE_MAX_COLUMN_VAL_LENGTH, "1000"),
DDui___(HBASE_MAX_ESPS, "9999"),
DDui___(HBASE_MAX_NUM_SEARCH_KEYS, "512"),
DDkwd__(HBASE_MEMSTORE_FLUSH_SIZE_OPTION, ""),
DDui1__(HBASE_MIN_BYTES_PER_ESP_PARTITION, "67108864"),
DDkwd__(HBASE_NATIVE_IUD, "ON"),
DDui1__(HBASE_NUM_CACHE_ROWS_MAX, "1024"),
DDui1__(HBASE_NUM_CACHE_ROWS_MIN, "100"),
DDkwd__(HBASE_RANGE_PARTITIONING, "ON"),
DDkwd__(HBASE_RANGE_PARTITIONING_MC_SPLIT, "ON"),
DDkwd__(HBASE_RANGE_PARTITIONING_PARTIAL_COLS,"ON"),
DDui___(HBASE_REGION_SERVER_MAX_HEAP_SIZE, "1024"), // in units of MB
DDkwd__(HBASE_ROWSET_VSBB_OPT, "ON"),
DDusht_(HBASE_ROWSET_VSBB_SIZE, "1024"),
DDflt0_(HBASE_SALTED_TABLE_MAX_FILE_SIZE, "0"),
DDkwd__(HBASE_SALTED_TABLE_SET_SPLIT_POLICY, "ON"),
DDkwd__(HBASE_SERIALIZATION, "ON"),
DD_____(HBASE_SERVER, ""),
DDkwd__(HBASE_SMALL_SCANNER, "OFF"),
DDkwd__(HBASE_SQL_IUD_SEMANTICS, "ON"),
DDkwd__(HBASE_STATS_PARTITIONING, "ON"),
// If set to 'OFF' we get a stub cost of 0 for update operations.
DDkwd__(HBASE_UPDATE_COSTING, "ON"),
DDkwd__(HBASE_UPDEL_CURSOR_OPT, "ON"),
DDui___(HBASE_USE_FAKED_REGIONS, "0"),
DD_____(HBASE_ZOOKEEPER_PORT, ""),
DDui1__(HDFS_IO_BUFFERSIZE, "65536"),
DDui___(HDFS_IO_BUFFERSIZE_BYTES, "0"),
DDui___(HDFS_IO_INTERIM_BYTEARRAY_SIZE_IN_KB, "1024"),
// The value 0 denotes RangeTail = max record length of table.
DDui___(HDFS_IO_RANGE_TAIL, "0"),
DDkwd__(HDFS_PREFETCH, "ON"),
DDkwd__(HDFS_READ_CONTINUE_ON_ERROR, "OFF"),
DDui1__(HDFS_REPLICATION, "1"),
DDkwd__(HDFS_USE_CURSOR_MULTI, "OFF"),
DDkwd__(HGB_BITMUX, "OFF"),
DDflt0_(HGB_CPUCOST_INITIALIZE, "1."),
DDflt0_(HGB_DP2_MEMORY_LIMIT, "10000."),
DDflte_(HGB_GROUPING_FACTOR_FOR_SPILLED_CLUSTERS, ".5"),
DDflte_(HGB_MAX_TABLE_SIZE_FOR_CLUSTERS, "4E5"),
DDflte_(HGB_MEMORY_AVAILABLE_FOR_CLUSTERS, "10"),
DDflte_(HH_OP_ALLOCATE_HASH_TABLE, ".05"),
DDflt1_(HH_OP_HASHED_ROW_OVERHEAD, "8."),
// From observation:
// 03/11/98: probing the hash table is very inexpensive,
// thus reduce this to almost zero.
// change
// CPUCOST_HASH_PER_KEY
// when changing this value
// It takes around 2 seconds to insert 100,000 rows into the chain:
// @ 0.00005 secs per k instr:
// k instr= 2/0.00005/100000 = 0.4
// History:
// Before 03/11/98: 0.4
// Initially: 0.01
DDflte_(HH_OP_INSERT_ROW_TO_CHAIN, "0.51"),
// From observation:
// 03/11/98: probing the hash table is very inexpensive,
// thus reduce this to almost zero.
// 01/05/98: 15,433 rows probed per second @ 0.00005 seconds
// per thousand of instructions, give:
// seconds to probe one row = 1/15,433 = 0.000064796
// This time includes: time to position and to compare. Thus
// subtract the time to compare to arrive to the proper number:
// thd. of instructions per row inserted =
// 1/15,433/0.00005 - CPUCOST_COMPARE_SIMPLE_DATA_TYPE =
// 1.2959 - 0.2 = 1.0959
// History:
// Before 03/11/98: 1.0959
// Before 01/05/98: 0.01
DDflt0_(HH_OP_PROBE_HASH_TABLE, "0.011"),
// Added 10/16/02
DDkwd__(HIDE_INDEXES, "NONE"),
DDansi_(HISTOGRAMS_SCHEMA, ""),
// -------------------------------------------------------------------------
// Histogram fudge factors
// -------------------------------------------------------------------------
//HIST_BASE_REDUCTION and HIST_PREFETCH externalized 08/21/01 CR 10-010713-3895
DDkwd__(HIST_ASSUME_INDEPENDENT_REDUCTION, "ON"),
DDflt0_(HIST_BASE_REDUCTION_FUDGE_FACTOR, "0.1"),
DDflt0_(HIST_CONSTANT_ALPHA, "0.5"),
DDflt_0_1(HIST_DEFAULT_BASE_SEL_FOR_LIKE_WILDCARD, "0.50"),
DDui1__(HIST_DEFAULT_NUMBER_OF_INTERVALS, "50"),
DDui1__(HIST_DEFAULT_SAMPLE_MAX, "1000000"),
DDui1__(HIST_DEFAULT_SAMPLE_MIN, "10000"),
DDflt_0_1(HIST_DEFAULT_SAMPLE_RATIO, "0.01"),
DDflte_(HIST_DEFAULT_SEL_FOR_BOOLEAN, "0.3333"),
DDflt_0_1(HIST_DEFAULT_SEL_FOR_IS_NULL, "0.01"),
DDflt_0_1(HIST_DEFAULT_SEL_FOR_JOIN_EQUAL, "0.3333"),
DDflt_0_1(HIST_DEFAULT_SEL_FOR_JOIN_RANGE, "0.3333"),
DDflt_0_1(HIST_DEFAULT_SEL_FOR_LIKE_NO_WILDCARD,"1.0"),
DDflt_0_1(HIST_DEFAULT_SEL_FOR_LIKE_WILDCARD, "0.10"),
DDflt_0_1(HIST_DEFAULT_SEL_FOR_PRED_EQUAL, "0.01"),
DDflt_0_1(HIST_DEFAULT_SEL_FOR_PRED_RANGE, "0.3333"),
// control the amount of data in each partition of the persistent sample tble.
DDflt1_(HIST_FETCHCOUNT_SCRATCH_VOL_THRESHOLD, "10240000"),
DDkwd__(HIST_FREQ_VALS_NULL_FIX, "ON"),
DDkwd__(HIST_INCLUDE_SKEW_FOR_NON_INNER_JOIN, "ON"),
DDkwd__(HIST_INTERMEDIATE_REDUCTION, "OFF"),
DDflt0_(HIST_INTERMEDIATE_REDUCTION_FUDGE_FACTOR, "0.25"),
DDflt_0_1(HIST_JOIN_CARD_LOWBOUND, "1.0"),
DDui1__(HIST_LOW_UEC_THRESHOLD, "55"),
DDui1__(HIST_MAX_NUMBER_OF_INTERVALS, "10000"),
DDkwd__(HIST_MC_STATS_NEEDED, "ON"),
DDkwd__(HIST_MERGE_FREQ_VALS_FIX, "ON"),
// Histogram min/max optimization: when the predicate is of form
// T.A = MIN/MAX(S.B), replace the histogram(T.A) with
// single_int_histogram(MIN/MAX(S.B)). Do this only when
// there is no local predicate on S and there exists a frequent
// value that is equals to MIN/MAX(S.B).
DDkwd__(HIST_MIN_MAX_OPTIMIZATION, "ON"),
// This CQD is used to control the number of missing stats warnings
// that should be generated.
// 0 ? Display no warnings.
// 1 ? Display only missing single column stats warnings. These include 6008 and 6011
// 2 ? Display all single column missing stats warnings and
// multi-column missing stats warnings for Scans only.
// 3 ? Display all missing single column stats warnings and missing
// multi-column stats warnings for Scans and Join operators only..
// 4 ? Display all missing single column stats and missing multi-column
// stats warnings for all operators including Scans, Joins and GroupBys.
// The CQD also does not have an impact on the auto update stats behavior. The stats will
// still be automatically generated even if the warnings have been suppressed.
// USTAT_AUTO_MISSING_STATS_LEVEL.
// Default behavior is to generate all warnings
XDDui___(HIST_MISSING_STATS_WARNING_LEVEL, "4"),
DDflt1_(HIST_NO_STATS_ROWCOUNT, "100"),
DDflt1_(HIST_NO_STATS_UEC, "2"),
DDflt1_(HIST_NO_STATS_UEC_CHAR1, "10"),
DDui1__(HIST_NUM_ADDITIONAL_DAYS_TO_EXTRAPOLATE, "4"),
DDintN1__(HIST_ON_DEMAND_STATS_SIZE, "0"),
DDui___(HIST_OPTIMISTIC_CARD_OPTIMIZATION, "1"),
XDDkwd__(HIST_PREFETCH, "ON"),
XDDkwd__(HIST_REMOVE_TRAILING_BLANKS, "ON"), // should remove after verifying code is solid
DDansi_(HIST_ROOT_NODE, ""),
XDDflt1_(HIST_ROWCOUNT_REQUIRING_STATS, "500"),
DD_____(HIST_SCRATCH_VOL, ""),
// control the amount of data in each partition of the sample tble.
DDflt1_(HIST_SCRATCH_VOL_THRESHOLD, "10240000"),
DDflt_0_1(HIST_SKEW_COST_ADJUSTMENT, "0.2"),
DDkwd__(HIST_SKIP_MC_FOR_NONKEY_JOIN_COLUMNS, "OFF"),
DDui___(HIST_TUPLE_FREQVAL_LIST_THRESHOLD, "40"),
DDkwd__(HIST_USE_HIGH_FREQUENCY_INFO, "ON"),
XDDkwd__(HIST_USE_SAMPLE_FOR_CARDINALITY_ESTIMATION , "ON"),
// CQDs for Trafodion on Hive
// Main ones to use:
// HIVE_MAX_STRING_LENGTH_IN_BYTES: Hive "string" data type gets converted
// into a VARCHAR with this length
// HIVE_MIN_BYTES_PER_ESP_PARTITION: Make one ESP for this many bytes
// HIVE_NUM_ESPS_PER_DATANODE: Equivalent of MAX_ESPS_PER_CPU_PER_OP
// Note that this is really per SeaQuest node
DD_____(HIVE_CATALOG, ""),
DDkwd__(HIVE_CREATE_TABLE_LIKE_PARTITION_NO_NULL, "OFF"),
DDkwd__(HIVE_CTAS_IN_NATIVE_MODE, "OFF"),
DDkwd__(HIVE_DATA_MOD_CHECK, "ON"),
DDkwd__(HIVE_DEFAULT_CHARSET, (char *)SQLCHARSETSTRING_UTF8),
DD_____(HIVE_DEFAULT_SCHEMA, "HIVE"),
DD_____(HIVE_FILE_CHARSET, ""),
DD_____(HIVE_HDFS_STATS_LOG_FILE, ""),
DDui___(HIVE_INSERT_ERROR_MODE, "1"),
DDint__(HIVE_LIB_HDFS_PORT_OVERRIDE, "-1"),
DDint__(HIVE_LOCALITY_BALANCE_LEVEL, "0"),
DDui___(HIVE_MAX_BINARY_LENGTH, "128"),
DDui___(HIVE_MAX_ESPS, "9999"),
DDui___(HIVE_MAX_STRING_LENGTH_IN_BYTES, "32000"),
DDint__(HIVE_METADATA_REFRESH_INTERVAL, "0"),
DDflt0_(HIVE_MIN_BYTES_PER_ESP_PARTITION, "67108864"),
DDkwd__(HIVE_NO_REGISTER_OBJECTS, "OFF"),
DDui___(HIVE_NUM_ESPS_PER_DATANODE, "2"),
DDpct__(HIVE_NUM_ESPS_ROUND_DEVIATION, "34"),
DDint__(HIVE_SCAN_SPECIAL_MODE, "0"),
DDkwd__(HIVE_SORT_HDFS_HOSTS, "ON"),
DDkwd__(HIVE_USE_EXT_TABLE_ATTRS, "ON"),
DD_____(HIVE_USE_FAKE_SQ_NODE_NAMES, "" ),
DDkwd__(HIVE_USE_FAKE_TABLE_DESC, "OFF"),
DDkwd__(HIVE_USE_HASH2_AS_PARTFUNCION, "ON"),
DDkwd__(HIVE_VIEWS, "ON"),
// -------------------------------------------------------------------------
DDflt0_(HJ_CPUCOST_INITIALIZE, "1."),
DDui1__(HJ_INITIAL_BUCKETS_PER_CLUSTER, "4."),
DDkwd__(HJ_NEW_MCSB_PLAN, "OFF"),
DDint__(HJ_SCAN_TO_NJ_PROBE_SPEED_RATIO, "2000"),
DDkwd__(HJ_TYPE, "HYBRID"),
DDkwd__(HQC_CONVDOIT_DISABLE_NUMERIC_CHECK, "OFF"),
DDkwd__(HQC_LOG, "OFF"),
DD_____(HQC_LOG_FILE, ""),
DDui1_10(HQC_MAX_VALUES_PER_KEY, "5"),
DDkwd__(HYBRID_QUERY_CACHE, "ON"),
DDkwd__(IF_LOCKED, "WAIT"),
DDkwd__(IMPLICIT_DATETIME_INTERVAL_HOSTVAR_CONVERSION, "FALSE"),
DDkwd__(IMPLICIT_HOSTVAR_CONVERSION, "FALSE"),
// threshold for the number of rows inserted into a volatile/temp
// table which will cause an automatic update stats.
// -1 indicates do not upd stats. 0 indicates always upd stats.
DDint__(IMPLICIT_UPD_STATS_THRESHOLD, "-1"), //"10000"),
DDkwd__(INCORPORATE_SKEW_IN_COSTING, "ON"),
DDkwd__(INDEX_ELIMINATION_LEVEL, "AGGRESSIVE"),
DDui1__(INDEX_ELIMINATION_THRESHOLD, "50"),
DDkwd__(INDEX_HINT_WARNINGS, "ON"),
SDDkwd__(INFER_CHARSET, "OFF"),
// UDF initial row cost CQDs
DDui___(INITIAL_UDF_CPU_COST, "100"),
DDui___(INITIAL_UDF_IO_COST, "1"),
DDui___(INITIAL_UDF_MSG_COST, "2"),
DDkwd__(INPUT_CHARSET, (char *)SQLCHARSETSTRING_ISO88591), // SQLCHARSETSTRING_UTF8
XDDkwd__(INSERT_VSBB, "SYSTEM"),
//10-040621-7139-begin
//This CDQ will alllow the user to force the compiler to
//choose an interactive access path. ie., prefer access path with
//index in it. If such a path is not found which ever access path is
//available is chosen.
DDkwd__(INTERACTIVE_ACCESS, "OFF"),
//10-040621-7139-end
DDkwd__(IN_MEMORY_OBJECT_DEFN, "OFF"),
// History:
// 3/11/99 Changed to zero because in large tables the read-ahead
// seems negligible (and/or hard to simulate)
// Before 3/11/99: 0.58
DDflt0_(IO_TRANSFER_COST_PREFETCH_MISSES_FRACTION, "0."),
XDDkwd__(ISOLATION_LEVEL, "READ_COMMITTED"),
XDDkwd__(ISOLATION_LEVEL_FOR_UPDATES, "NONE"),
SDDkwd__(ISO_MAPPING, (char *)SQLCHARSETSTRING_ISO88591),
DDkwd__(IS_DB_TRANSPORTER, "OFF"),
DDkwd__(IS_SQLCI, "FALSE"),
DDkwd__(IUD_NONAUDITED_INDEX_MAINT, "OFF"),
DDkwd__(JDBC_PROCESS, "FALSE"),
// Force the join order given by the user
XDDkwd__(JOIN_ORDER_BY_USER, "OFF"),
DDkwd__(KEYLESS_NESTED_JOINS, "OFF"),
XDDkwd__(LAST0_MODE, "OFF"),
DDansi_(LDAP_USERNAME, ""),
// Disallow/Allow left joins in MultiJoin framework
DDkwd__(LEFT_JOINS_SPOIL_JBB, "OFF"),
DDkwd__(LIMIT_HBASE_SCAN_DOP, "OFF"),
// if this default is set to ON, then the max precision of a numeric
// expression(arithmetic, aggregate) is limited to MAX_NUMERIC_PRECISION
// (= 18). If this is set to OFF, the default value, then the max precision
// is computed based on the operands and the operation which could make the
// result a software datatype(BIGNUM). Software datatypes give better
// precision but degraded performance.
SDDkwd__(LIMIT_MAX_NUMERIC_PRECISION, "SYSTEM"),
// Size in MB used to perform garbage collection to lob data file
// Recommended size is 20GB . Change to adjust disk usage. If -1 it means
// don't do GC during insert/update operations.
DDint__(LOB_GC_LIMIT_SIZE, "-1"),
DDint__(LOB_HDFS_PORT, "0"),
DD_____(LOB_HDFS_SERVER, "default"),
// For JDBC/ODBC batch operations, LOB size limited to 4K bytes
DDint__(LOB_INPUT_LIMIT_FOR_BATCH, "16384"),
// Control the locking via RMS shared lock. This ensures the CLI and HDFS
// operations for any LOB UID are done under a lock so concurrent operations
// wont conflict and cause incosistent data. For non concurrent applications,
// we can turn this off as a performance enhancement.
DDkwd__(LOB_LOCKING, "OFF"),
// Size of memoryin Megabytes used to perform I/O to lob data file
// default size is 128MB . Change to adjust memory usage.
DDint__(LOB_MAX_CHUNK_MEM_SIZE, "128"),
// default size is 5 G (5120 M)
DDint__(LOB_MAX_SIZE, "5120"),
// default size is 32000bytes. Change this to extract more data into memory.
DDui___(LOB_OUTPUT_SIZE, "32000"),
DD_____(LOB_STORAGE_FILE_DIR, "/user/trafodion/lobs"),
// storage types defined in exp/ExpLOBenum.h.
// Default is hdfs_file (value = 2)
DDint__(LOB_STORAGE_TYPE, "2"),
//New default size for buffer size for local node
DDui2__(LOCAL_MESSAGE_BUFFER_SIZE, "50"),
DDansi_(MAINTAIN_CATALOG, "NEO"),
// Set the maintain control table timeout to 5 minutes
DDint__(MAINTAIN_CONTROL_TABLE_TIMEOUT, "30000"),
DDkwd__(MARIAQUEST_PROCESS, "OFF"),
DDSint__(MASTER_PRIORITY, "0"),
DDSint__(MASTER_PRIORITY_DELTA, "0"),
DDint__(MATCH_CONSTANTS_OF_EQUALITY_PREDICATES, "2"),
DDui1__(MAX_ACCESS_NODES_PER_ESP, "1024"),
DDint__(MAX_DEPTH_TO_CHECK_FOR_CYCLIC_PLAN, "1"),
// default value of maximum dp2 groups for a hash-groupby
DDui1__(MAX_DP2_HASHBY_GROUPS, "1000"),
//
// The max number of ESPs per cpu for a given operator.
// i.e. this number times the number of available CPUs is "max pipelines".
//
// On Linux, "CPU" means cores.
//
DDflt__(MAX_ESPS_PER_CPU_PER_OP, "0.5"),
DDui1__(MAX_EXPRS_USED_FOR_CONST_FOLDING, "1000"),
// used in hash groupby costing in esp/master
DDui1__(MAX_HEADER_ENTREIS_PER_HASH_TABLE, "250000"),
DDui1__(MAX_LONG_VARCHAR_DEFAULT_SIZE, "2000"),
DDui1__(MAX_LONG_WVARCHAR_DEFAULT_SIZE, "2000"),
DD18_128(MAX_NUMERIC_PRECISION_ALLOWED, "128"),
// The max number of skewed values detected - skew buster
DDui1__(MAX_SKEW_VALUES_DETECTED, "10000"),
// multi-column skew inner table broadcast threashold in bytes (=1 MB)
DDui___(MC_SKEW_INNER_BROADCAST_THRESHOLD, "1000000"),
// multi-column skew sensitivity threshold
//
// For new MCSB (that is, we utilize MC skews directly),
// apply the MC skew buster when
// frequency of MC skews > MC_SKEW_SENSITIVITY_THRESHOLD / count_of_cpus
//
// For old MCSB (that is, we guess MC skews from SC skews),
// apply the MC skew buster when
// SFa,b... * countOfPipeline > MC_SKEW_SENSITIVITY_THRESHOLD
// SFa,b ... is the skew factor for multi column a,b,...
//
XDDflt__(MC_SKEW_SENSITIVITY_THRESHOLD, "0.1"),
// Applies additional heuristics to turn off MDAM. This code was added
// at a time when cumulative probe cost was not considered in the MDAM
// cost model (a MAJOR error). The meaning of the values:
// 0 - do nothing (no additional heuristics)
// 1 - require that more key columns have predicates than key columns
// without predicates
// 2 - require that the UECs of key columns lacking predicates is below
// a given threshold
// 3 - AND of 1 and 2
// These heuristics made sense when the cost model was broken and we
// traversed more deeply into the key than we should have. The cost model
// now takes cumulative probe cost into account so these should no longer
// be necessary (and indeed these heuristics can cause us to miss some
// very good plans, because they prevent us from considering MDAM plans
// that probe prefix columns before a column with high UEC, for example).
DDui___(MDAM_APPLY_RESTRICTION_CHECK, "0"),
// MDAM_COSTING_REWRITE: If ON, then the simple cost model costing
// for MDAM will use the rewritten code. If OFF, it will use the
// older code (which was current in September 2017, at the time
// the rewrite commenced). This only has an effect if SIMPLE_COST_MODEL
// is ON (which is the current default).
XDDkwd__(MDAM_COSTING_REWRITE, "OFF"),
DDflt0_(MDAM_CPUCOST_NET_OVH, "2000."),
// The cost that takes to build the mdam network per predicate:
// (we assume that the cost to build the mdam network is a linear function
// of the key predicates)
DDflt0_(MDAM_CPUCOST_NET_PER_PRED, ".5"),
// Added by JIRA TRAFODION-2765: Allows consideration of MDAM
// in more general circumstances.
XDDkwd__(MDAM_FSO_SIMPLE_RULE, "ON"),
// controls the max. number of seek positions under which MDAM will be
// allowed. Set it to 0 turns off the feature.
XDDui___(MDAM_NO_STATS_POSITIONS_THRESHOLD, "10"),
// a multiplier of probe cost used for MDAM
DDflt0_(MDAM_PROBE_TAX, "3"),
// MDAM_SCAN_METHOD ON means MDAM is enabled,
// OFF means MDAM is disabled. MDAM is enabled by default
// externalized 06/21/01 RV
// mdam off on open source at this point
XDDkwd__(MDAM_SCAN_METHOD, "ON"),
DDflt0_(MDAM_SELECTION_DEFAULT, "8.0"),
// Overhead charge for a subset in the rewritten MDAM costing code
DDflt0_(MDAM_SUBSET_FACTOR, "8.0"),
DDflt0_(MDAM_TOTAL_UEC_CHECK_MIN_RC_THRESHOLD, "10000"),
DDflt0_(MDAM_TOTAL_UEC_CHECK_UEC_THRESHOLD, "0.2"),
DDkwd__(MDAM_TRACING, "OFF"),
// controls the max. number of probes at which MDAM under NJ plan will be
// generated. Set it to 0 turns off the feature.
XDDui___(MDAM_UNDER_NJ_PROBES_THRESHOLD, "0"),
// controls the amount of penalty for CPU resource required that is
// beyond the value specified by MDOP_CPUS_SOFT_LIMIT. The number of extra CPUs
// actually allocated is computed as the origial value divided by the CQD.
// If the CQD is set to 1 (default), then there is no penalty.
DDflt1_(MDOP_CPUS_PENALTY, "70"),
// specify the limit beyond which the number of CPUs will be limited.
DDui1__(MDOP_CPUS_SOFT_LIMIT, "64"),
// controls the amount of penalty for CPU resource per memory unit
// required that is beyond the value specified by MDOP_CPUS_SOFT_LIMIT.
// The number of extra CPUs actually allocated is computed as the
// origial value divided by the CQD.
DDflt1_(MDOP_MEMORY_PENALTY, "70"),
// CQD to test/enforce heap memory upper limits
// values are in KB
DDui___(MEMORY_LIMIT_CMPCTXT_UPPER_KB, "0"),
DDui___(MEMORY_LIMIT_CMPSTMT_UPPER_KB, "0"),
DDui___(MEMORY_LIMIT_HISTCACHE_UPPER_KB, "0"),
DDui___(MEMORY_LIMIT_NATABLECACHE_UPPER_KB, "0"),
DDui___(MEMORY_LIMIT_QCACHE_UPPER_KB, "0"),
// Checked at compile time. Set to -1 to disable check.
// Value should be >= EXE_MEMORY_FOR_UNPACK_ROWS_IN_MB
DDint__(MEMORY_LIMIT_ROWSET_IN_MB, "1024"),
// SQL/MX Compiler/Optimzer Memory Monitor.
DDkwd__(MEMORY_MONITOR, "OFF"),
DDui1__(MEMORY_MONITOR_AFTER_TASKS, "30000"),
DDkwd__(MEMORY_MONITOR_IN_DETAIL, "OFF"),
DD_____(MEMORY_MONITOR_LOGFILE, "NONE"),
DDkwd__(MEMORY_MONITOR_LOG_INSTANTLY, "OFF"),
DDui1__(MEMORY_MONITOR_TASK_INTERVAL, "5000"),
// Hash join currently uses 20 Mb before it overflows, use this
// as the limit
DDui1__(MEMORY_UNITS_SIZE, "20480"),
// amount of memory available per CPU for any query
SDDflte_(MEMORY_UNIT_ESP, "300"),
DDflt1_(MEMORY_USAGE_NICE_CONTEXT_FACTOR, "1"),
DDflt1_(MEMORY_USAGE_OPT_PASS_FACTOR, "1.5"),
DDui1__(MEMORY_USAGE_SAFETY_NET, "500"),
// MERGE_JOINS ON means do MERGE_JOINS
XDDkwd__(MERGE_JOINS, "ON"),
DDkwd__(MERGE_JOIN_ACCEPT_MULTIPLE_NJ_PROBES, "ON"),
DDkwd__(MERGE_JOIN_CONTROL, "OFF"),
DDkwd__(MERGE_JOIN_WITH_POSSIBLE_DEADLOCK, "OFF"),
// controls if merge/upsert is supported on table with a unique index
DDkwd__(MERGE_WITH_UNIQUE_INDEX, "ON"),
SDDui___(METADATA_CACHE_SIZE, "20"),
//-------------------------------------------------------------------
// Minimum ESP parallelism. If the user does not specify this value
// (default value 0 does not change) then the number of segments
// (totalNumCPUs/16, where totalNumCPUs=gpClusterInfo->numOfSMPs())
// will be used as the value of minimum ESP parallelism. If user sets
// this value it should be integer between 1 and totalNumCPUs. In
// this case actual value of minimum ESP parallelism will be
// min(CDQ value, MDOP), where MDOP (maximum degree of parallelism)
// is defined by adaptive segmentation
//-------------------------------------------------------------------
DDui___(MINIMUM_ESP_PARALLELISM, "0"),
DDui1__(MIN_LONG_VARCHAR_DEFAULT_SIZE, "1"),
DDui1__(MIN_LONG_WVARCHAR_DEFAULT_SIZE, "1"),
DDkwd__(MIN_MAX_OPTIMIZATION, "ON"),
DDpct__(MJ_BMO_QUOTA_PERCENT, "0"),
DDflt0_(MJ_CPUCOST_CLEAR_LIST, ".01"),
DDflt0_(MJ_CPUCOST_GET_NEXT_ROW_FROM_LIST, ".01"),
// calibrated 01/16/98:
// 01/13/98 40000., this did not work with small tables
// Before 01/13/98: 0.5
DDflt0_(MJ_CPUCOST_INITIALIZE, "1."),
// Before 03/12/98: 0.4
// Before 01/13/98: 0.01
DDflt0_(MJ_CPUCOST_INSERT_ROW_TO_LIST, ".0001"),
DDflt0_(MJ_CPUCOST_REWIND_LIST, ".01"),
DDflte_(MJ_LIST_NODE_SIZE, ".01"),
DDkwd__(MJ_OVERFLOW, "ON"),
DDkwd__(MODE_SEAHIVE, "ON"),
SDDkwd__(MODE_SPECIAL_1, "OFF"),
DDkwd__(MODE_SPECIAL_4, "OFF"),
// Tests suggest that RELEASE is about 2.5 times faster than DEBUG
// RELEASE is always faster than DEBUG code so this default must be
// at least one.
DDflt1_(MSCF_DEBUG_TO_RELEASE_MULTIPLIER, "2.5"),
// MSCF_ET_CPU units are seconds/thousand of CPU instructions
// History:
// Before 02/01/99, the speed was calibrated for debug, now its is for
// release: 0.00005
DDflte_(MSCF_ET_CPU, "0.000014"),
// was 0.00002 12/2k
// MSCF_ET_IO_TRANSFER units are seconds/Kb
// History
// Changed to '0.000455' to reflect new calibration data
// Before 03/11/99 "0.000283"
DDflte_(MSCF_ET_IO_TRANSFER, "0.00002"),
// Assume time to transfer a KB of local message is 5 times
// faster than the time to transfer a KB from disk
// Units of MSCF_ET_LOCAL_MSG_TRANSFER are seconds/Kb
DDflte_(MSCF_ET_LOCAL_MSG_TRANSFER, "0.000046"),
// : for calibration on 04/08/2004
// Seek time will be derived from disk type.
// MSCF_ET_NUM_IO_SEEKS units are seconds
DDflte_(MSCF_ET_NUM_IO_SEEKS, "0.0038"),
// Assume sending a local message takes 1000 cpu instructions
DDflte_(MSCF_ET_NUM_LOCAL_MSGS, "0.000125"),
// Assume sending a remote message takes 10000 cpu instructions
// DDflte_(MSCF_ET_NUM_REMOTE_MSGS, "0.00125"),
// Change the number of instructions to encode a remote message to be
// the same as the local message
DDflte_(MSCF_ET_NUM_REMOTE_MSGS, "0.000125"),
// Assume 1MB/second transfer rate for transferring remote message bytes
// (Based on 10 Megabit/second Ethernet transfer rate)
// MSCF_ET_REMOTE_MSG_TRANSFER units are kb/Sec
// DDflte_(MSCF_ET_REMOTE_MSG_TRANSFER, "0.001"),
// the remote msg are 10% more costly than the local transfer
// but also may depend on the physical link, so externalize it
DDflte_(MSCF_ET_REMOTE_MSG_TRANSFER, "0.00005"),
// -------------------------------------------------------------------------
// Factors used for estimating overlappability of I/O and messaging used
// in the calculation for overlapped addition
// Assume 50% overlap for now.
// -------------------------------------------------------------------------
DDflte_(MSCF_OV_IO, "0.5"),
DDflte_(MSCF_OV_MSG, "0.5"),
DDkwd__(MTD_GENERATE_CC_PREDS, "ON"),
DDint__(MTD_MDAM_NJ_UEC_THRESHOLD, "100"),
// Allow for the setting of the row count in a long running operation
XDDui1__(MULTI_COMMIT_SIZE, "10000"),
// try the join order specified in the queries, this will cause the
// enumeration of the initial join order specified by the user
// among the join orders enumerated
// ** This is currently OFF by default **
DDkwd__(MULTI_JOIN_CONSIDER_INITIAL_JOIN_ORDER, "OFF"),
// used in JBBSubsetAnalysis::isAStarPattern for finding lowest cost
// outer subtree for NJ into fact table.
DDflt0_(MULTI_JOIN_PROBE_HASH_TABLE, "0.000001"),
SDDint__(MULTI_JOIN_THRESHOLD, "3"),
DDint__(MULTI_PASS_JOIN_ELIM_LIMIT, "5"),
DDflt0_(MU_CPUCOST_INITIALIZE, ".05"),
DDui___(MU_INITIAL_BUFFER_COUNT, "5."),
DDflte_(MU_INITIAL_BUFFER_SIZE, "1033.7891"),
//--------------------------------------------------------------------------
//++ MV
XDDkwd__(MVGROUP_AUTOMATIC_CREATION, "ON"),
DDkwd__(MVQR_ALL_JBBS_IN_QD, "OFF"),
#ifdef NDEBUG
DDkwd__(MVQR_ENABLE_LOGGING, "OFF"), // No logging by default for release
#else
DDkwd__(MVQR_ENABLE_LOGGING, "ON"),
#endif
DDkwd__(MVQR_LOG_QUERY_DESCRIPTORS, "OFF"),
DDint__(MVQR_MAX_EXPR_DEPTH, "20"),
DDint__(MVQR_MAX_EXPR_SIZE, "100"),
DDkwd__(MVQR_PARAMETERIZE_EQ_PRED, "ON"),
DDkwd__(MVQR_PRIVATE_QMS_INIT, "SMD"),
DDkwd__(MVQR_PUBLISH_TO, "BOTH"),
DDansi_(MVQR_REWRITE_CANDIDATES, ""),
XDDkwd__(MVQR_REWRITE_ENABLED_OPTION, "OFF"), // @ZX -- change to ON later
XDDui0_5(MVQR_REWRITE_LEVEL, "0"),
XDDkwd__(MVQR_REWRITE_SINGLE_TABLE_QUERIES, "ON"),
DDkwd__(MVQR_USE_EXTRA_HUB_TABLES, "ON"),
DDkwd__(MVQR_USE_RI_FOR_EXTRA_HUB_TABLES, "OFF"),
DD_____(MVQR_WORKLOAD_ANALYSIS_MV_NAME, ""),
XDDMVA__(MV_AGE, "0 MINUTES"),
XDDkwd__(MV_ALLOW_SELECT_SYSTEM_ADDED_COLUMNS, "OFF"),
DDkwd__(MV_AS_ROW_TRIGGER, "OFF"),
DDkwd__(MV_DUMP_DEBUG_INFO, "OFF"),
DDkwd__(MV_ENABLE_INTERNAL_REFRESH_SHOWPLAN, "OFF"),
DDui___(MV_LOG_CLEANUP_SAFETY_FACTOR, "200"),
DDui___(MV_LOG_CLEANUP_USE_MULTI_COMMIT, "1"),
SDDkwd__(MV_LOG_PUSH_DOWN_DP2_DELETE, "OFF"), // push down mv logging tp dp2 for delete
SDDkwd__(MV_LOG_PUSH_DOWN_DP2_INSERT, "OFF"), // push down mv logging tp dp2 for insert
SDDkwd__(MV_LOG_PUSH_DOWN_DP2_UPDATE, "ON"), // push down mv logging tp dp2 for update
SDDui___(MV_REFRESH_MAX_PARALLELISM, "0"),
DDui___(MV_REFRESH_MAX_PIPELINING, "0"),
DDint__(MV_REFRESH_MDELTA_MAX_DELTAS_THRESHOLD, "31"),
DDint__(MV_REFRESH_MDELTA_MAX_JOIN_SIZE_FOR_SINGLE_PHASE, "3"),
DDint__(MV_REFRESH_MDELTA_MIN_JOIN_SIZE_FOR_SINGLE_PRODUCT_PHASE, "8"),
DDint__(MV_REFRESH_MDELTA_PHASE_SIZE_FOR_MID_RANGE, "6"),
DDkwd__(MV_TRACE_INCONSISTENCY, "OFF"),
DDSint__(MXCMP_PRIORITY, "0"),
DDSint__(MXCMP_PRIORITY_DELTA, "0"),
DDkwd__(NAMETYPE, "ANSI"),
DDkwd__(NAR_DEPOBJ_ENABLE, "ON"),
DDkwd__(NAR_DEPOBJ_ENABLE2, "ON"),
// NATIONAL_CHARSET reuses the "kwd" logic here, w/o having to add any
// DF_ token constants (this can be considered either clever or kludgy coding).
DDkwd__(NATIONAL_CHARSET, (char *)SQLCHARSETSTRING_UNICODE),
// These CQDs are reserved for NCM. These are mostly used for
// internal testing, turning on/off features for debugging, and for tuning.
// In normal situations, these will not be externalized in keeping
// with the very few CQDs philosophy of NCM.
// These are applicable only in conjunction with SIMPLE_COST_MODEL 'on'.
DDflt__(NCM_CACHE_SIZE_IN_BLOCKS, "52"),
DDflt__(NCM_COSTLIMIT_FACTOR, "0.05"), //change to 0.05
DDint__(NCM_ESP_FIXUP_WEIGHT, "300"),
DDkwd__(NCM_ESP_STARTUP_FIX, "ON"),
DDflt__(NCM_EXCH_MERGE_FACTOR, "0.10"), // change to 0.10
DDkwd__(NCM_EXCH_NDCS_FIX, "ON"), // change to ON
DDkwd__(NCM_HBASE_COSTING, "ON"), // change to ON
DDkwd__(NCM_HGB_OVERFLOW_COSTING, "ON"),
DDkwd__(NCM_HJ_OVERFLOW_COSTING, "ON"),
DDflt__(NCM_IND_JOIN_COST_ADJ_FACTOR, "1.0"),
DDflt__(NCM_IND_JOIN_SELECTIVITY, "1.0"),
DDflt__(NCM_IND_SCAN_COST_ADJ_FACTOR, "1.0"),
DDflt__(NCM_IND_SCAN_SELECTIVITY, "1.0"),
DDflt__(NCM_MAP_CPU_FACTOR, "4.0"),
DDflt__(NCM_MAP_MSG_FACTOR, "4.0"),
DDflt__(NCM_MAP_RANDIO_FACTOR, "4.0"),
DDflt__(NCM_MAP_SEQIO_FACTOR, "4.0"),
DDflt__(NCM_MDAM_COST_ADJ_FACTOR, "1.0"),
DDflt__(NCM_MJ_TO_HJ_FACTOR, "0.6"),
DDflt__(NCM_NJ_PC_THRESHOLD, "1.0"),
DDflt0_(NCM_NJ_PROBES_MAXCARD_FACTOR, "10000"),
DDkwd__(NCM_NJ_SEQIO_FIX, "ON"), // change to ON
DDint__(NCM_NUM_SORT_RUNS, "4"),
DDflt__(NCM_PAR_ADJ_FACTOR, "0.10"),
DDkwd__(NCM_PAR_GRPBY_ADJ, "ON"),
DDkwd__(NCM_PRINT_ROWSIZE, "OFF"),
DDflt__(NCM_RAND_IO_ROWSIZE_FACTOR, "0"),
DDflt__(NCM_RAND_IO_WEIGHT, "3258"),
DDflt__(NCM_SEQ_IO_ROWSIZE_FACTOR, "0"),
DDflt__(NCM_SEQ_IO_WEIGHT, "543"),
DDflt__(NCM_SERIAL_NJ_FACTOR, "2"),
DDflt__(NCM_SGB_TO_HGB_FACTOR, "0.8"),
DDkwd__(NCM_SKEW_COST_ADJ_FOR_PROBES, "OFF"),
DDkwd__(NCM_SORT_OVERFLOW_COSTING, "ON"),
DDflt__(NCM_TUPLES_ROWSIZE_FACTOR, "0.5"),
DDflt__(NCM_UDR_NANOSEC_FACTOR, "0.01"),
// NESTED_JOINS ON means do NESTED_JOINS
XDDkwd__(NESTED_JOINS, "ON"),
// max. number of ESPs that will deal with skews for OCR
// 0 means to turn off the feature
DDintN1__(NESTED_JOINS_ANTISKEW_ESPS , "16"),
DDkwd__(NESTED_JOINS_CHECK_LEADING_KEY_SKEW, "OFF"),
DDkwd__(NESTED_JOINS_FULL_INNER_KEY, "OFF"),
DDkwd__(NESTED_JOINS_KEYLESS_INNERJOINS, "ON"),
DDui1__(NESTED_JOINS_LEADING_KEY_SKEW_THRESHOLD, "15"),
DDkwd__(NESTED_JOINS_NO_NSQUARE_OPENS, "ON"),
DDkwd__(NESTED_JOINS_OCR_GROUPING, "OFF"),
// 128X32 being the default threshold for OCR.
// 128 partitions per table and 32 ESPs per NJ operator
SDDint__(NESTED_JOINS_OCR_MAXOPEN_THRESHOLD, "4096"),
// PLAN0 is solely controlled by OCR. If this CQD is off, then
// PLAN0 is off unconditionally. This CQD is used by OCR unit test.
DDkwd__(NESTED_JOINS_PLAN0, "ON"),
// try the explicit sort plan when plan2 produces a non-sort plan
DDkwd__(NESTED_JOINS_PLAN3_TRY_SORT, "ON"),
// Enable caching for eligible nested joins - see NestedJoin::preCodeGen.
DDkwd__(NESTED_JOIN_CACHE, "ON"),
// Enable pulling up of predicates into probe cache
DDkwd__(NESTED_JOIN_CACHE_PREDS, "ON"),
// Nested Join Heuristic
DDkwd__(NESTED_JOIN_CONTROL, "ON"),
// Allow nested join for cross products
DDkwd__(NESTED_JOIN_FOR_CROSS_PRODUCTS, "ON"),
DDkwd__(NEW_MDAM, "ON"),
DDkwd__(NEW_OPT_DRIVER, "ON"),
DDflt0_(NJ_CPUCOST_INITIALIZE, ".1"),
DDflt0_(NJ_CPUCOST_PASS_ROW, ".02"),
DDflte_(NJ_INC_AFTERLIMIT, "0.0055"),
DDflte_(NJ_INC_MOVEROWS, "0.0015"),
DDflte_(NJ_INC_UPTOLIMIT, "0.0225"),
DDui___(NJ_INITIAL_BUFFER_COUNT, "5"),
DDui1__(NJ_INITIAL_BUFFER_SIZE, "5"),
DDui1__(NJ_MAX_SEEK_DISTANCE, "5000"),
// UDF costing CQDs for processing a steady state row
DDui___(NORMAL_UDF_CPU_COST, "100"),
DDui___(NORMAL_UDF_IO_COST, "0"),
DDui___(NORMAL_UDF_MSG_COST, "2"),
XDDui30_32000(NOT_ATOMIC_FAILURE_LIMIT, "32000"),
//NOT IN ANSI NULL semantics rule
DDkwd__(NOT_IN_ANSI_NULL_SEMANTICS, "ON"),
//NOT IN optimization
DDkwd__(NOT_IN_OPTIMIZATION, "ON"),
//NOT IN outer column optimization
DDkwd__(NOT_IN_OUTER_OPTIMIZATION, "ON"),
// NOT IN skew buster optimization
DDkwd__(NOT_IN_SKEW_BUSTER_OPTIMIZATION, "ON"),
DDkwd__(NOT_NULL_CONSTRAINT_DROPPABLE_OPTION, "OFF"),
// NSK DEBUG defaults
DDansi_(NSK_DBG, "OFF"),
DDansi_(NSK_DBG_COMPILE_INSTANCE, "USER"),
DDkwd__(NSK_DBG_GENERIC, "OFF"),
DDansi_(NSK_DBG_LOG_FILE, ""),
DDkwd__(NSK_DBG_MJRULES_TRACKING, "OFF"),
DDkwd__(NSK_DBG_PRINT_CHAR_INPUT, "OFF"),
DDkwd__(NSK_DBG_PRINT_CHAR_OUTPUT, "OFF"),
DDkwd__(NSK_DBG_PRINT_CONSTRAINT, "OFF"),
DDkwd__(NSK_DBG_PRINT_CONTEXT, "OFF"),
DDkwd__(NSK_DBG_PRINT_CONTEXT_POINTER, "OFF"),
DDkwd__(NSK_DBG_PRINT_COST, "OFF"),
DDkwd__(NSK_DBG_PRINT_INDEX_ELIMINATION, "OFF"),
DDkwd__(NSK_DBG_PRINT_ITEM_EXPR, "OFF"),
DDkwd__(NSK_DBG_PRINT_LOG_PROP, "OFF"),
DDkwd__(NSK_DBG_PRINT_PHYS_PROP, "OFF"),
DDkwd__(NSK_DBG_PRINT_TASK, "OFF"),
DDkwd__(NSK_DBG_PRINT_TASK_STACK, "OFF"),
DDkwd__(NSK_DBG_QUERY_LOGGING_ONLY, "OFF"),
DDansi_(NSK_DBG_QUERY_PREFIX, ""),
DDkwd__(NSK_DBG_SHOW_PASS1_PLAN, "OFF"),
DDkwd__(NSK_DBG_SHOW_PASS2_PLAN, "OFF"),
DDkwd__(NSK_DBG_SHOW_PLAN_LOG, "OFF"),
DDkwd__(NSK_DBG_SHOW_TREE_AFTER_ANALYSIS, "OFF"),
DDkwd__(NSK_DBG_SHOW_TREE_AFTER_BINDING, "OFF"),
DDkwd__(NSK_DBG_SHOW_TREE_AFTER_CODEGEN, "OFF"),
DDkwd__(NSK_DBG_SHOW_TREE_AFTER_NORMALIZATION, "OFF"),
DDkwd__(NSK_DBG_SHOW_TREE_AFTER_PARSING, "OFF"),
DDkwd__(NSK_DBG_SHOW_TREE_AFTER_PRE_CODEGEN, "OFF"),
DDkwd__(NSK_DBG_SHOW_TREE_AFTER_SEMANTIC_QUERY_OPTIMIZATION, "OFF"),
DDkwd__(NSK_DBG_SHOW_TREE_AFTER_TRANSFORMATION, "OFF"),
DDflt0_(NUMBER_OF_PARTITIONS_DEVIATION, "0.25"),
DDui1__(NUMBER_OF_ROWS_PARALLEL_THRESHOLD, "5000"),
DDui1__(NUMBER_OF_USERS, "1"),
DDui1__(NUM_OF_BLOCKS_PER_ACCESS, "SYSTEM"),
DDflt0_(NUM_OF_PARTS_DEVIATION_TYPE2_JOINS, "SYSTEM"),
DDkwd__(NVCI_PROCESS, "FALSE"),
DDflt0_(OCB_COST_ADJSTFCTR, "0.996"),
DDui___(OCR_FOR_SIDETREE_INSERT, "1"),
DDkwd__(ODBC_PROCESS, "FALSE"),
DDflte_(OHJ_BMO_REUSE_SORTED_BMOFACTOR_LIMIT, "3.0"),
DDflte_(OHJ_BMO_REUSE_SORTED_UECRATIO_UPPERLIMIT, "0.7"),
DDflte_(OHJ_BMO_REUSE_UNSORTED_UECRATIO_UPPERLIMIT, "0.01"),
DDflte_(OHJ_VBMOLIMIT, "5.0"),
DDui1__(OLAP_BUFFER_SIZE, "262144"), // Do not alter (goes to DP2)
DDkwd__(OLAP_CAN_INVERSE_ORDER, "ON"),
DDui1__(OLAP_MAX_FIXED_WINDOW_EXTRA_BUFFERS, "2"),
DDui1__(OLAP_MAX_FIXED_WINDOW_FRAME, "50000"),
DDui1__(OLAP_MAX_NUMBER_OF_BUFFERS, "100000"),
DDui___(OLAP_MAX_ROWS_IN_OLAP_BUFFER, "0"),
//aplies for fixed window-- number of additional oplap buffers
//to allocate on top of the minumum numbers
DDkwd__(OLD_HASH2_GROUPING, "FALSE"),
DDkwd__(OLT_QUERY_OPT, "ON"),
DDkwd__(OLT_QUERY_OPT_LEAN, "OFF"),
// -----------------------------------------------------------------------
// Optimizer pruning heuristics.
// -----------------------------------------------------------------------
DDkwd__(OPH_EXITHJCRCONTCHILOOP, "ON"),
DDkwd__(OPH_EXITMJCRCONTCHILOOP, "ON"),
DDkwd__(OPH_EXITNJCRCONTCHILOOP, "OFF"),
DDkwd__(OPH_PRUNE_WHEN_COST_LIMIT_EXCEEDED, "OFF"),
DDflt__(OPH_PRUNING_COMPLEXITY_THRESHOLD, "10.0"),
DDflt__(OPH_PRUNING_PASS2_COST_LIMIT, "-1.0"),
DDkwd__(OPH_REDUCE_COST_LIMIT_FROM_CANDIDATES, "OFF"),
DDkwd__(OPH_REDUCE_COST_LIMIT_FROM_PASS1_SOLUTION, "ON"),
DDkwd__(OPH_REUSE_FAILED_PLAN, "ON"),
DDkwd__(OPH_REUSE_OPERATOR_COST, "OFF"),
DDkwd__(OPH_SKIP_OGT_FOR_SHARED_GC_FAILED_CL, "OFF"),
DDkwd__(OPH_USE_CACHED_ELAPSED_TIME, "ON"),
DDkwd__(OPH_USE_CANDIDATE_PLANS, "OFF"),
DDkwd__(OPH_USE_COMPARE_COST_THRESHOLD, "ON"),
DDkwd__(OPH_USE_CONSERVATIVE_COST_LIMIT, "OFF"),
DDkwd__(OPH_USE_ENFORCER_PLAN_PROMOTION, "OFF"),
DDkwd__(OPH_USE_FAILED_PLAN_COST, "ON"),
DDkwd__(OPH_USE_NICE_CONTEXT, "OFF"),
DDkwd__(OPH_USE_ORDERED_MJ_PRED, "OFF"),
DDkwd__(OPH_USE_PWS_FLAG_FOR_CONTEXT, "OFF"),
DDkwd__(OPTIMIZATION_GOAL, "LASTROW"),
XDDkwd__(OPTIMIZATION_LEVEL, "3"),
DDpct__(OPTIMIZATION_LEVEL_1_CONSTANT_1, "50"),
DDpct__(OPTIMIZATION_LEVEL_1_CONSTANT_2, "0"),
DDui1__(OPTIMIZATION_LEVEL_1_IMMUNITY_LIMIT, "5000"),
DDui1__(OPTIMIZATION_LEVEL_1_MJENUM_LIMIT, "20"),
DDui1__(OPTIMIZATION_LEVEL_1_SAFETY_NET, "30000"),
DDflt__(OPTIMIZATION_LEVEL_1_SAFETY_NET_MULTIPLE, "3.0"),
DDui1__(OPTIMIZATION_LEVEL_1_THRESHOLD, "1000"),
DDui1__(OPTIMIZATION_TASKS_LIMIT, "2000000000"),
// Optimizer Graceful Termination:
// 1=> randomProbabilistic pruning
// > 1 pruning based on potential
DDui1__(OPTIMIZER_GRACEFUL_TERMINATION, "2"),
DDkwd__(OPTIMIZER_HEURISTIC_1, "OFF"),
DDkwd__(OPTIMIZER_HEURISTIC_2, "OFF"),
DDkwd__(OPTIMIZER_HEURISTIC_3, "OFF"),
DDkwd__(OPTIMIZER_HEURISTIC_4, "OFF"),
DDkwd__(OPTIMIZER_HEURISTIC_5, "OFF"),
// Tells the compiler to print costing information
DDkwd__(OPTIMIZER_PRINT_COST, "OFF"),
// Tells the compiler to issue a warning with its internal counters
DDkwd__(OPTIMIZER_PRINT_INTERNAL_COUNTERS, "OFF"),
// Pruning is OFF because of bugs, turn to ON when bugs are fixed
// (03/03/98)
SDDkwd__(OPTIMIZER_PRUNING, "ON"),
DDkwd__(OPTIMIZER_PRUNING_FIX_1, "ON"), //change to ON
DDkwd__(OPTIMIZER_SYNTH_FUNC_DEPENDENCIES, "ON"),
//OPTS_PUSH_DOWN_DAM made external RV 06/21/01 CR 10-010425-2440
DDui___(OPTS_PUSH_DOWN_DAM, "0"),
DDkwd__(ORDERED_HASH_JOIN_CONTROL, "ON"),
SDDkwd__(OR_OPTIMIZATION, "ON"),
DDkwd__(OR_PRED_ADD_BLOCK_TO_IN_LIST, "ON"),
DDkwd__(OR_PRED_KEEP_CAST_VC_UCS2, "ON"),
// controls the jump table method of evaluating an or pred. in a scan node
// 0 => feature is OFF, positive integer denotes max OR pred that will be
// processed through a jump table.
DDint__(OR_PRED_TO_JUMPTABLE, "2000"),
// controls semijoin method of evaluating an or pred.
// 0 => feature is OFF, positive number means if pred do not cover key cols
// and jump table is not available, then the transformation is done if
// inlist is larger than this value.
DDint__(OR_PRED_TO_SEMIJOIN, "100"),
// Ratio of tablesize (without application of any preds)to probes below
// which semijoin trans. is favoured.
DDflt0_(OR_PRED_TO_SEMIJOIN_PROBES_MAX_RATIO, "0.001"),
// Minimum table size beyond which semijoin trans. is considered
DDint__(OR_PRED_TO_SEMIJOIN_TABLE_MIN_SIZE, "10000"),
DDui2__(OS_MESSAGE_BUFFER_SIZE, "32"),
// if set to "ansi", datetime output is in ansi format. Currently only
// used in special_1 mode if the caller needs datetime value in
// ansi format (like, during upd stats).
DDansi_(OUTPUT_DATE_FORMAT, ""),
// Overflow mode for scratch files
DDkwd__(OVERFLOW_MODE, "DISK"),
// Sequence generator override identity values
DDkwd__(OVERRIDE_GENERATED_IDENTITY_VALUES, "OFF"),
// allow users to specify a source schema to be
// replaced by a target schema
SDDosch_(OVERRIDE_SCHEMA, ""),
// Allows users to specify their own SYSKEY value. In other words
// the system does not generate one for them.
// Prior to this CQD, pm_regenerate_syskey_for_insert was being used
// to preserve the syskey. Carrying over these comments from
// pm_regenerate_syskey_for_insert
// For audited target partition, PM does the copy in multiple transactions
// In each transaction PM does a insert/select from the source to the target
// partition. The clustering key values from the last row of a transaction
// is used as begin key value for the next transaction. If the table
// has a syskey then it gets regenerated and last row contains the new
// value for the syskey. This obviously causes us to start at a different
// place then we intended to start from. The following default when set
// to off forces the engine to not regenerate syskey.
DDkwd__(OVERRIDE_SYSKEY, "OFF"),
DDui___(PARALLEL_ESP_NODEMASK, "0"),
// by default all parallelism heuristics are switched ON.
DDkwd__(PARALLEL_HEURISTIC_1, "ON"),
DDkwd__(PARALLEL_HEURISTIC_2, "ON"),
DDkwd__(PARALLEL_HEURISTIC_3, "ON"),
DDkwd__(PARALLEL_HEURISTIC_4, "ON"),
// If PARALLEL_NUM_ESPS is "SYSTEM",
// optimizer will compute the number of ESPs.
XDDui1__(PARALLEL_NUM_ESPS, "SYSTEM"),
// is partial sort applicable; if so adjust sort cost accordingly
DDflt0_(PARTIAL_SORT_ADJST_FCTR, "1"),
DDint__(PARTITIONING_SCHEME_SHARING, "1"),
// The optimal number of partition access nodes for a process.
// NOTE: Setting this to anything other than 1 will cause problems
// with Cascades plan stealing! Don't do it unless you have to!
DDui1__(PARTITION_ACCESS_NODES_PER_ESP, "1"),
DD_____(PCODE_DEBUG_LOGDIR, "" ), // Pathname of log directory for PCode work
DDint__(PCODE_EXPR_CACHE_CMP_ONLY, "0" ), // PCode Expr Cache compare-only mode
DDint__(PCODE_EXPR_CACHE_DEBUG, "0" ), // PCode Expr Cache debug (set to 1 to enable dbg logging)
DDint__(PCODE_EXPR_CACHE_ENABLED, "0" ), // PCode Expr Cache Enabled (set to 0 to disable the cache)
DD0_10485760(PCODE_EXPR_CACHE_SIZE,"2000000"), // PCode Expr Cache Max Size
// Maximum number of PCODE Branch Instructions in an Expr
// for which we will attempt PCODE optimizations.
// NOTE: Default value reduced to 12000 for Trafodion to avoid stack
// overflow in PCODE optimization where recursion is used.
DDint__(PCODE_MAX_OPT_BRANCH_CNT, "12000"),
// Maximum number of PCODE Instructions in an Expr
// for which we will attempt PCODE optimizations.
DDint__(PCODE_MAX_OPT_INST_CNT, "50000"),
DDint__(PCODE_NE_DBG_LEVEL, "-1"), // Native Expression Debug Level
DDint__(PCODE_NE_ENABLED, "1" ), // Native Expressions Enabled
DDkwd__(PCODE_NE_IN_SHOWPLAN, "ON"), // Native Expression in Showplan output
DDint__(PCODE_OPT_FLAGS, "60"),
DDkwd__(PCODE_OPT_LEVEL, "MAXIMUM"),
DDint__(PHY_MEM_CONTINGENCY_MB, "3072"),
DDkwd__(PLAN_STEALING, "ON"),
// Partition OVerlay Support (POS) options
SDDkwd__(POS, "DISK_POOL"),
DD_____(POS_DISKS_IN_SEGMENT, ""),
DD_____(POS_DISK_POOL, "0"),
SDDui___(POS_NUM_DISK_POOLS, "0"),
DDui___(POS_NUM_OF_PARTNS, "SYSTEM"),
SDDint__(POS_NUM_OF_TEMP_TABLE_PARTNS, "SYSTEM"),
SDDpos__(POS_TEMP_TABLE_SIZE, ""),
DDui___(POS_TEST_NUM_NODES, "0"),
// Use info from right child to require order on left child of NJ
//PREFERRED_PROBING_ORDER_FOR_NESTED_JOIN made external RV 06/21/01 CR 10-010425-2440
DDkwd__(PREFERRED_PROBING_ORDER_FOR_NESTED_JOIN, "OFF"),
DD0_18(PRESERVE_MIN_SCALE, "0"),
DDkwd__(PRIMARY_KEY_CONSTRAINT_DROPPABLE_OPTION, "OFF"),
DDkwd__(PSHOLD_CLOSE_ON_ROLLBACK, "OFF"),
DDkwd__(PSHOLD_UPDATE_BEFORE_FETCH, "OFF"),
SDDpsch_(PUBLIC_SCHEMA_NAME, ""),
// Query Invalidation - Debug/Regression test CQDs -- DO NOT externalize these
DD_____(QI_PATH, "" ), // Specifies cat.sch.object path for object to have cache entries removed
DD0_255(QI_PRIV, "0"), // Note: 0 disables the Debug Mechanism. Set non-zero to kick out cache entries.
// Then set back to 0 *before* setting to a non-zero value again.
// Do the query analysis phase
DDkwd__(QUERY_ANALYSIS, "ON"),
// query_cache max should be 200 MB. Set it 0 to turn off query cache
//XDD0_200000(QUERY_CACHE, "0"),
XDD0_200000(QUERY_CACHE, "16384"),
// the initial average plan size (in kbytes) to use for configuring the
// number of hash buckets to use for mxcmp's hash table of cached plans
DD1_200000(QUERY_CACHE_AVERAGE_PLAN_SIZE, "30"),
// literals longer than this are not parameterized
DDui___(QUERY_CACHE_MAX_CHAR_LEN, "32000"),
// a query with more than QUERY_CACHE_MAX_EXPRS ExprNodes is not cacheable
DDint__(QUERY_CACHE_MAX_EXPRS, "1000"),
// the largest number of cache entries that an unusually large cache
// entry is allowed to displace from mxcmp's cache of query plans
DD0_200000(QUERY_CACHE_MAX_VICTIMS, "10"),
DD0_255(QUERY_CACHE_REQUIRED_PREFIX_KEYS, "255"),
DDkwd__(QUERY_CACHE_RUNTIME, "ON"),
SDDflt0_(QUERY_CACHE_SELECTIVITY_TOLERANCE, "0"),
// query cache statement pinning is off by default
DDkwd__(QUERY_CACHE_STATEMENT_PINNING, "OFF"),
DDkwd__(QUERY_CACHE_STATISTICS, "OFF"),
DD_____(QUERY_CACHE_STATISTICS_FILE, "qcachsts"),
DDkwd__(QUERY_CACHE_TABLENAME, "OFF"),
DDkwd__(QUERY_CACHE_USE_CONVDOIT_FOR_BACKPATCH, "ON"),
// Limit CPU time a query can use in master or any ESP. Unit is seconds.
XDDint__(QUERY_LIMIT_SQL_PROCESS_CPU, "0"),
// Extra debugging info for QUERY_LIMIT feature.
DDkwd__(QUERY_LIMIT_SQL_PROCESS_CPU_DEBUG, "OFF"),
// For X-prod HJ: (# of rows joined * LIMIT) before preempt.
DDint__(QUERY_LIMIT_SQL_PROCESS_CPU_XPROD, "10000"),
// controls various expr optimizations based on bit flags.
// see enum QueryOptimizationOptions in DefaultConstants.h
DDint__(QUERY_OPTIMIZATION_OPTIONS, "3"),
DDkwd__(QUERY_STRATEGIZER, "ON"),
DDkwd__(QUERY_TEMPLATE_CACHE, "ON"),
DDkwd__(QUERY_TEXT_CACHE, "SYSTEM"),
DDkwd__(R2_HALLOWEEN_SUPPORT, "OFF"),
DDkwd__(RANGESPEC_TRANSFORMATION, "ON"), // RangeSpec Transformation CQD.
// To be ANSI compliant you would have to set this default to 'FALSE'
DDkwd__(READONLY_CURSOR, "TRUE"),
DDflt0_(READ_AHEAD_MAX_BLOCKS, "16.0"),
// OFF means Ansi/NIST setting, ON is more similar to the SQL/MP behavior
DDkwd__(RECOMPILATION_WARNINGS, "OFF"),
// CLI caller to redrive CTAS(create table as) for child query monitoring
DDkwd__(REDRIVE_CTAS, "OFF"),
// The group by reduction for pushing a partial group by past the
// right side of the TSJ must be at least this much. If 0.0, then
// pushing it will always be tried.
DDflt0_(REDUCTION_TO_PUSH_GB_PAST_TSJ, "0.0000000001"),
// This is the code base for the calibration machine. It must be either
// "DEBUG" or "RELEASE"
// History:
// Before 02/01/99: DEBUG
DDkwd__(REFERENCE_CODE, "RELEASE"),
// This is the frequency of the representative CPU of the base calibration
// cluster.
// REFERENCE_CPU_FREQUENCY units are MhZ
DDflte_(REFERENCE_CPU_FREQUENCY, "199."),
// This is the seek time of the representative disk of the base
// calibration cluster.
// REFERENCE_IO_SEEK_TIME units are seconds
DDflte_(REFERENCE_IO_SEEK_TIME, "0.0038"),
// This is the sequential transfer rate for the representative
// disk of the base calibration cluster.
// REFERENCE_IO_SEQ_READ_RATE units are Mb/Sec
DDflte_(REFERENCE_IO_SEQ_READ_RATE, "50.0"),
// This is the transfer rate for the fast speed connection of
// nodes in the base calibration cluster.
// REFERENCE_MSG_LOCAL_RATE units are Mb/Sec
DDflte_(REFERENCE_MSG_LOCAL_RATE, "10."),
// This is the timeper local msg for the fast speed connection of
// nodes in the base calibration cluster.
// REFERENCE_MSG_LOCAL_TIME units are seconds
DDflte_(REFERENCE_MSG_LOCAL_TIME, "0.000125"),
// This is the transfer rate for the connection among clusters
// in the base calibration cluster (this only applies to NSK)
// REFERENCE_MSG_REMOTE_RATE units are Mb/Sec
DDflte_(REFERENCE_MSG_REMOTE_RATE, "1."),
// This is the time per remote msg for the fast speed connection of
// nodes in the base calibration cluster.
// REFERENCE_MSG_REMOTE_TIME units are seconds
DDflte_(REFERENCE_MSG_REMOTE_TIME, "0.00125"),
DDkwd__(REF_CONSTRAINT_NO_ACTION_LIKE_RESTRICT, "SYSTEM"),
DDrlis_(REPLICATE_ALLOW_ROLES, ""),
// Determines the compression type to be used with DDL when replicating
DDkwd__(REPLICATE_COMPRESSION_TYPE, "SYSTEM"),
// Determines if DISK POOL setting should be passed with DDL when replicating
DDkwd__(REPLICATE_DISK_POOL, "ON"),
// VERSION of the message from the source system to maintain compatibility
// This version should be same as REPL_IO_VERSION_CURR in executor/ExeReplInterface.h
// Make changes accordingly in validataorReplIoVersion validator
DDrver_(REPLICATE_IO_VERSION, "17"),
DDkwd__(REUSE_BASIC_COST, "ON"),
// if set, tables are not closed at the end of a query. This allows
// the same open to be reused for the next query which accesses that
// table.
// If the table is shared opened by multiple openers from the same
// process, then the share count is decremented until it reaches 1.
// At that time, the last open is preserved so it could be reused.
// Tables are closed if user id changes.
DDkwd__(REUSE_OPENS, "ON"),
// multiplicative factor used to inflate cost of risky operators.
// = 1.0 means do not demand an insurance premium from risky operators.
// = 1.2 means demand a 20% insurance premium that cost of risky operators
// must overcome before they will be chosen over less-risky operators.
DDflt0_(RISK_PREMIUM_MJ, "1.15"),
XDDflt0_(RISK_PREMIUM_NJ, "1.0"),
XDDflt0_(RISK_PREMIUM_SERIAL, "1.0"),
XDDui___(RISK_PREMIUM_SERIAL_SCALEBACK_MAXCARD_THRESHOLD, "10000"),
DDflt0_(ROBUST_HJ_TO_NJ_FUDGE_FACTOR, "0.0"),
DDflt0_(ROBUST_PAR_GRPBY_EXCHANGE_FCTR, "0.25"),
DDflt0_(ROBUST_PAR_GRPBY_LEAF_FCTR, "0.25"),
// external master CQD that sets following internal CQDs
// robust_query_optimization
// MINIMUM SYSTEM HIGH MAXIMUM
// risk_premium_NJ 1.0 system 2.5 5.0
// risk_premium_SERIAL 1.0 system 1.5 2.0
// partitioning_scheme_sharing 0 system 2 2
// robust_hj_to_nj_fudge_factor 0.0 system 3.0 1.0
// robust_sortgroupby 0 system 2 2
// risk_premium_MJ 1.0 system 1.5 2.0
// see optimizer/ControlDB.cpp ControlDB::doRobustQueryOptimizationCQDs
// for the actual cqds that set these values
XDDkwd__(ROBUST_QUERY_OPTIMIZATION, "SYSTEM"),
// 0: allow sort group by in all
// 1: disallow sort group by from partial grpByRoot if no order requirement
// 2: disallow sort group by from partial grpByRoot
// 3: disallow sort group by in ESP
DDint__(ROBUST_SORTGROUPBY, "1"),
SDDui___(ROUNDING_MODE, "0"),
DDui___(ROUTINE_CACHE_SIZE, "20"),
// UDF default Uec
DDui___(ROUTINE_DEFAULT_UEC, "1"),
DDkwd__(ROUTINE_JOINS_SPOIL_JBB, "OFF"),
DDkwd__(ROWSET_ROW_COUNT, "OFF"),
DDint__(SAP_KEY_NJ_TABLE_SIZE_THRESHOLD, "10000000"),
DDkwd__(SAP_PREFER_KEY_NESTED_JOIN, "OFF"),
DDint__(SAP_TUPLELIST_SIZE_THRESHOLD, "5000"),
XDDansi_(SCHEMA, "SEABASE"),
//specify a : separated list of full path names where scratch files
//should reside. Ensure each specified directoy exisst on each node and
//Trafodion user has permissions to access them.
DD_____(SCRATCH_DIRS, ""),
DDkwd__(SCRATCH_DISK_LOGGING, "OFF"),
SDDpct__(SCRATCH_FREESPACE_THRESHOLD_PERCENT, "1"),
DDui___(SCRATCH_IO_BLOCKSIZE_SORT_MAX, "5242880"),
//On LINUX, writev and readv calls are used to perform
//scratch file IO. This CQD sets the vector size to use
//in writev and readv calls. Overall IO size is affected
//by this cqd. Also, related cqds that are related to
//IO size are: COMP_INT_67, GEN_HGBY_BUFFER_SIZE.
//GEN_HSHJ_BUFFER_SIZE, OLAP_BUFFER_SIZE,
//EXE_HGB_INITIAL_HT_SIZE. Vector size is no-op on other
//platforms.
DDui___(SCRATCH_IO_VECTOR_SIZE_HASH, "8"),
DDui___(SCRATCH_IO_VECTOR_SIZE_SORT, "1"),
DDui___(SCRATCH_MAX_OPENS_HASH, "1"),
DDui___(SCRATCH_MAX_OPENS_SORT, "1"),
DDui___(SCRATCH_MGMT_OPTION, "11"),
DDkwd__(SCRATCH_PREALLOCATE_EXTENTS, "OFF"),
DD_____(SEABASE_CATALOG, TRAFODION_SYSCAT_LIT),
DDkwd__(SEABASE_VOLATILE_TABLES, "ON"),
// SeaMonster messaging -- the default can be ON, OFF, or SYSTEM.
// When the default is SYSTEM we take the setting from env var
// SQ_SEAMONSTER which will have a value of 0 or 1.
DDkwd__(SEAMONSTER, "SYSTEM"),
// If the inner table of a semi-join has fewer rows than this,
// we'll allow it to be transformed to a join.
DDflt1_(SEMIJOIN_TO_INNERJOIN_INNER_ALLOWANCE, "100.0"),
// Ratio of right child cardinality to uec above which semijoin
// trans. is favored.
DDflt1_(SEMIJOIN_TO_INNERJOIN_REDUCTION_RATIO, "5.0"),
SDDkwd__(SEMIJOIN_TO_INNERJOIN_TRANSFORMATION, "SYSTEM"),
// Disallow/Allow semi and anti-semi joins in MultiJoin framework
DDkwd__(SEMI_JOINS_SPOIL_JBB, "OFF"),
DDansi_(SESSION_ID, ""),
DDkwd__(SESSION_IN_USE, "OFF"),
DDansi_(SESSION_USERNAME, ""),
DDflt0_(SGB_CPUCOST_INITIALIZE, ".05"),
DDui___(SGB_INITIAL_BUFFER_COUNT, "5."),
DDui1__(SGB_INITIAL_BUFFER_SIZE, "5."),
DDkwd__(SHARE_TEMPLATE_CACHED_PLANS, "ON"),
DDui___(SHORT_OPTIMIZATION_PASS_THRESHOLD, "12"),
SDDkwd__(SHOWCONTROL_SHOW_ALL, "OFF"),
SDDkwd__(SHOWCONTROL_SHOW_SUPPORT, "OFF"),
DDkwd__(SHOWDDL_DISPLAY_FORMAT, "EXTERNAL"),
DDkwd__(SHOWDDL_DISPLAY_PRIVILEGE_GRANTS, "SYSTEM"),
DDint__(SHOWDDL_FOR_REPLICATE, "0"),
DDkwd__(SHOWWARN_OPT, "ON"),
DDkwd__(SIMPLE_COST_MODEL, "ON"),
XDDkwd__(SKEW_EXPLAIN, "ON"),
XDDflt__(SKEW_ROWCOUNT_THRESHOLD, "1000000"), // Column row count
// threshold below
// which skew
// buster is disabled.
XDDflt__(SKEW_SENSITIVITY_THRESHOLD, "0.1"),
DDkwd__(SKIP_UNAVAILABLE_PARTITION, "OFF"),
DDui0_5(SOFT_REQ_HASH_TYPE, "2"),
DDkwd__(SORT_ALGO, "QS"),
// Calibration
// 01/23/98: 10000
// Original: 10.
DDflt0_(SORT_CPUCOST_INITIALIZE, "10000."),
DDui1__(SORT_EX_BUFFER_SIZE, "5."),
DDkwd__(SORT_INTERMEDIATE_SCRATCH_CLEANUP, "ON"),
DDui1__(SORT_IO_BUFFER_SIZE, "128."),
DD1_200000(SORT_MAX_HEAP_SIZE_MB, "800"),
DDkwd__(SORT_MEMORY_QUOTA_SYSTEM, "ON"),
DD1_128(SORT_MERGE_BUFFER_UNIT_56KB, "1"),
// Calibration
// 04/06/2005: 1.5
DDflte_(SORT_QS_FACTOR, "1.5"),
//Maximum records after which sort would switch over to
//iterative heap sort. Most often in partial sort, we may want
//do a quick sort or similar to avoid larger in-memory sort
//setup.
DDint__(SORT_REC_THRESHOLD, "1000"),
// Calibration
DDflte_(SORT_RS_FACTOR, "3.55"),
// Calibration
// 04/06/2005: 2.1
DDflte_(SORT_RW_FACTOR, "2.1"),
DDflte_(SORT_TREE_NODE_SIZE, ".012"),
DDkwd__(SQLMX_REGRESS, "OFF"),
SDDui___(SSD_BMO_MAX_MEM_THRESHOLD_IN_MB, "1200"),
// BertBert VV
// Timeout for a streaming cursor to return to the fetch(), even if no
// rows to return. The cursor is NOT closed, it just gives control to
// the user again.
// "0" means no timeout, just check instead.
// "negative" means never timeout.
// "positive" means the number of centiseconds to wait before timing out.
XDDint__(STREAM_TIMEOUT, "-1"),
XDDkwd__(SUBQUERY_UNNESTING, "ON"),
DDkwd__(SUBQUERY_UNNESTING_P2, "ON"),
DDkwd__(SUBSTRING_TRANSFORMATION, "OFF"),
DDkwd__(SUPPRESS_CHAR_LIMIT_CHECK, "OFF"),
XDDkwd__(TABLELOCK, "SYSTEM"),
// This is the code base for the end user calibration cluster.
// It must be either "DEBUG" or "RELEASE"
#ifdef NDEBUG
DDkwd__(TARGET_CODE, "RELEASE"),
#else
DDkwd__(TARGET_CODE, "DEBUG"),
#endif
// This is the frequency of the representative CPU of the end user
// cluster.
// TARGET_CPU_FREQUENCY units are MhZ.
DDflte_(TARGET_CPU_FREQUENCY, "199."),
// This is the seek time of the representative disk of the end user
// cluster.
// TARGET_IO_SEEK_TIME units are seconds
DDflte_(TARGET_IO_SEEK_TIME, "0.0038"),
// This is the sequential transfer rate for the representative
// disk of the end user cluster.
// TARGET_IO_SEQ_READ_RATE units are Mb/Sec
DDflte_(TARGET_IO_SEQ_READ_RATE, "50.0"),
// This is the transfer rate for the fast speed connection of
// nodes in the end user cluster.
// TARGET_MSG_LOCAL_RATE units are Mb/Sec
DDflte_(TARGET_MSG_LOCAL_RATE, "10."),
// This is the per msg time for the fast speed connection of
// nodes in the end user cluster.
// TARGET_MSG_LOCAL_TIME are seconds
DDflte_(TARGET_MSG_LOCAL_TIME, "0.000125"),
// This is the transfer rate for the connection among clusters
// in the end user cluster (this only applies to NSK)
// TARGET_MSG_REMOTE_RATE units are Mb/Sec
DDflte_(TARGET_MSG_REMOTE_RATE, "1."),
// This is the per msg time for the the connection among clusters
// nodes in the end user cluster.
// TARGET_MSG_REMOTE_TIME are seconds
DDflte_(TARGET_MSG_REMOTE_TIME, "0.00125"),
DDkwd__(TERMINAL_CHARSET, (char *)SQLCHARSETSTRING_ISO88591),
DDint__(TEST_PASS_ONE_ASSERT_TASK_NUMBER, "-1"),
DDint__(TEST_PASS_TWO_ASSERT_TASK_NUMBER, "-1"),
XDDintN2(TIMEOUT, "6000"),
DDflt0_(TMUDF_CARDINALITY_FACTOR, "1"),
DDflt0_(TMUDF_LEAF_CARDINALITY, "1"),
DDkwd__(TOTAL_RESOURCE_COSTING, "ON"),
DDkwd__(TRAF_ALIGNED_ROW_FORMAT, "ON"),
DDkwd__(TRAF_ALLOW_ESP_COLOCATION, "OFF"),
DDkwd__(TRAF_ALLOW_RESERVED_COLNAMES, "OFF"),
DDkwd__(TRAF_ALLOW_SELF_REF_CONSTR, "ON"),
DDkwd__(TRAF_ALTER_ADD_PKEY_AS_UNIQUE_CONSTRAINT, "OFF"),
DDkwd__(TRAF_ALTER_COL_ATTRS, "ON"),
DDkwd__(TRAF_AUTO_CREATE_SCHEMA, "OFF"),
DDkwd__(TRAF_BINARY_INPUT, "OFF"),
DDkwd__(TRAF_BINARY_OUTPUT, "OFF"),
DDkwd__(TRAF_BINARY_SPJ_SUPPORT, "OFF"),
DDkwd__(TRAF_BINARY_SUPPORT, "OFF"),
DDkwd__(TRAF_BLOB_AS_VARCHAR, "OFF"), //set to OFF to enable Lobs support
DDkwd__(TRAF_BOOLEAN_IO, "OFF"),
DDkwd__(TRAF_BOOTSTRAP_MD_MODE, "OFF"),
DDkwd__(TRAF_CLOB_AS_VARCHAR, "OFF"), //set to OFF to enable Lobs support
DDkwd__(TRAF_COL_LENGTH_IS_CHAR, "ON"),
DDkwd__(TRAF_CREATE_SIGNED_NUMERIC_LITERAL, "ON"),
DDansi_(TRAF_CREATE_TABLE_WITH_UID, ""),
DDkwd__(TRAF_CREATE_TINYINT_LITERAL, "ON"),
DDkwd__(TRAF_DDL_ON_HIVE_OBJECTS, "ON"),
DDkwd__(TRAF_DEFAULT_COL_CHARSET, (char *)SQLCHARSETSTRING_ISO88591),
DDkwd__(TRAF_ENABLE_ORC_FORMAT, "OFF"),
DDkwd__(TRAF_HBASE_MAPPED_TABLES, "ON"),
DDkwd__(TRAF_HBASE_MAPPED_TABLES_IUD, "OFF"),
DDkwd__(TRAF_INDEX_ALIGNED_ROW_FORMAT, "ON"),
DDkwd__(TRAF_INDEX_CREATE_OPT, "OFF"),
DDkwd__(TRAF_LARGEINT_UNSIGNED_IO, "OFF"),
DDkwd__(TRAF_LOAD_ALLOW_RISKY_INDEX_MAINTENANCE, "OFF"),
DDkwd__(TRAF_LOAD_CONTINUE_ON_ERROR, "OFF"),
DD_____(TRAF_LOAD_ERROR_COUNT_ID, "" ),
DD_____(TRAF_LOAD_ERROR_COUNT_TABLE, "ERRORCOUNTER" ),
DD_____(TRAF_LOAD_ERROR_LOGGING_LOCATION, "/user/trafodion/bulkload/logs" ),
DDint__(TRAF_LOAD_FLUSH_SIZE_IN_KB, "1024"),
DDkwd__(TRAF_LOAD_FORCE_CIF, "ON"),
DDkwd__(TRAF_LOAD_LOG_ERROR_ROWS, "OFF"),
DDint__(TRAF_LOAD_MAX_ERROR_ROWS, "0"),
DDint__(TRAF_LOAD_MAX_HFILE_SIZE, "10240"), // in MB -->10GB by default
DDkwd__(TRAF_LOAD_PREP_ADJUST_PART_FUNC, "ON"),
DDkwd__(TRAF_LOAD_PREP_CLEANUP, "ON"),
DDkwd__(TRAF_LOAD_PREP_KEEP_HFILES, "OFF"),
DDkwd__(TRAF_LOAD_PREP_SKIP_DUPLICATES , "OFF"),
//need add code to check if folder exists or not. if not issue an error and ask
//user to create it
DD_____(TRAF_LOAD_PREP_TMP_LOCATION, "/user/trafodion/bulkload/" ),
DDkwd__(TRAF_LOAD_TAKE_SNAPSHOT , "OFF"),
DDkwd__(TRAF_LOAD_USE_FOR_INDEXES, "ON"),
DDkwd__(TRAF_LOAD_USE_FOR_STATS, "OFF"),
DDkwd__(TRAF_MAKE_PKEY_COLUMNS_NOT_NULL, "ON"),
// max size in bytes of a char or varchar column. Set to 16M
DDui___(TRAF_MAX_CHARACTER_COL_LENGTH, MAX_CHAR_COL_LENGTH_IN_BYTES_STR),
DDkwd__(TRAF_MAX_CHARACTER_COL_LENGTH_OVERRIDE, "OFF"),
// max size in MB of a row that canbe accomodated in scanner cache when
// using th the default scanner cache size.
DDint__(TRAF_MAX_ROWSIZE_IN_CACHE, "10"),
DDkwd__(TRAF_MULTI_COL_FAM, "ON"),
DDkwd__(TRAF_NO_CONSTR_VALIDATION, "OFF"),
DDkwd__(TRAF_NO_DTM_XN, "OFF"),
DDkwd__(TRAF_NO_HBASE_DROP_CREATE, "OFF"),
DDint__(TRAF_NUM_HBASE_VERSIONS, "0"),
DDint__(TRAF_NUM_OF_SALT_PARTNS, "-1"),
DDkwd__(TRAF_READ_OBJECT_DESC, "OFF"),
DDkwd__(TRAF_RELOAD_NATABLE_CACHE, "OFF"),
DD_____(TRAF_SAMPLE_TABLE_LOCATION, "/user/trafodion/sample/"),
DDint__(TRAF_SEQUENCE_CACHE_SIZE, "-1"),
DDint__(TRAF_SEQUENCE_RETRY_TIMES, "100"),
DDkwd__(TRAF_SIMILARITY_CHECK, "ROOT"),
DDkwd__(TRAF_STORE_OBJECT_DESC, "OFF"),
DDkwd__(TRAF_STRING_AUTO_TRUNCATE, "OFF"),
DDkwd__(TRAF_STRING_AUTO_TRUNCATE_WARNING, "OFF"),
//TRAF_TABLE_SNAPSHOT_SCAN CQD can be set to :
//NONE--> Snapshot scan is disabled and regular scan is used ,
//SUFFIX --> Snapshot scan enabled for the bulk unload (bulk unload
// behavior id not changed)
//LATEST --> enabled for the scan independently from bulk unload
// the latest snapshot is used if it exists
DDkwd__(TRAF_TABLE_SNAPSHOT_SCAN, "NONE"),
DD_____(TRAF_TABLE_SNAPSHOT_SCAN_SNAP_SUFFIX, "SNAP"),
//when the estimated table size is below the threshold (in MBs)
//defined by TRAF_TABLE_SNAPSHOT_SCAN_TABLE_SIZE_THRESHOLD
//regular scan instead of snapshot scan
//does not apply to bulk unload which maintains the old behavior
DDint__(TRAF_TABLE_SNAPSHOT_SCAN_TABLE_SIZE_THRESHOLD, "1000"),
//timeout before we give up when trying to create the snapshot scanner
DDint__(TRAF_TABLE_SNAPSHOT_SCAN_TIMEOUT, "6000"),
//location for temporary links and files produced by snapshot scan
DD_____(TRAF_TABLE_SNAPSHOT_SCAN_TMP_LOCATION, "/user/trafodion/bulkload/"),
DDkwd__(TRAF_TINYINT_INPUT_PARAMS, "OFF"),
DDkwd__(TRAF_TINYINT_RETURN_VALUES, "OFF"),
DDkwd__(TRAF_TINYINT_SPJ_SUPPORT, "OFF"),
DDkwd__(TRAF_TINYINT_SUPPORT, "ON"),
// DTM Transaction Type: MVCC, SSCC
XDDkwd__(TRAF_TRANS_TYPE, "MVCC"),
DD_____(TRAF_UNLOAD_DEF_DELIMITER, "|" ),
DD_____(TRAF_UNLOAD_DEF_RECORD_SEPARATOR, "\n" ),
DDint__(TRAF_UNLOAD_HDFS_COMPRESS, "0"),
DDkwd__(TRAF_UPSERT_ADJUST_PARAMS, "OFF"),
DDkwd__(TRAF_UPSERT_MODE, "MERGE"),
DDkwd__(TRAF_UPSERT_TO_EFF_TREE, "ON"),
DDint__(TRAF_UPSERT_WB_SIZE, "2097152"),
DDkwd__(TRAF_UPSERT_WRITE_TO_WAL, "OFF"),
DDkwd__(TRAF_USE_REGION_XN, "OFF"),
DDkwd__(TRAF_USE_RWRS_FOR_MD_INSERT, "ON"),
DDkwd__(TRANSLATE_ERROR, "ON"),
DDkwd__(TRANSLATE_ERROR_UNICODE_TO_UNICODE, "ON"),
DDkwd__(TRY_DP2_REPARTITION_ALWAYS, "OFF"),
SDDkwd__(TRY_PASS_ONE_IF_PASS_TWO_FAILS, "OFF"),
// Disallow/Allow TSJs in MultiJoin framework
DDkwd__(TSJS_SPOIL_JBB, "OFF"),
// type a CASE expression or ValueIdUnion as varchar if its leaves
// are of type CHAR of unequal length
DDkwd__(TYPE_UNIONED_CHAR_AS_VARCHAR, "ON"),
// UDF scalar indicating maximum number of rows out for each row in.
DDui___(UDF_FANOUT, "1"),
// Must be in form <cat>.<sch>. Delimited catalog names not allowed.
DD_____(UDF_METADATA_SCHEMA, "TRAFODION.\"_UDF_\""),
DDkwd__(UDF_SUBQ_IN_AGGS_AND_GBYS, "SYSTEM"),
XDDui___(UDR_DEBUG_FLAGS, "0"), // see sqludr/sqludr.h for values
SDD_____(UDR_JAVA_OPTIONS, "OFF"),
DD_____(UDR_JAVA_OPTION_DELIMITERS, " "),
XDDui___(UDR_JVM_DEBUG_PORT, "0"),
XDDui___(UDR_JVM_DEBUG_TIMEOUT, "0"),
DDkwd__(UNAVAILABLE_PARTITION, "STOP"), // "?" used?
DDkwd__(UNC_PROCESS, "OFF"),
SDDkwd__(UNIQUE_HASH_JOINS, "SYSTEM"),
SDDui___(UNIQUE_HASH_JOIN_MAX_INNER_SIZE, "1000"),
SDDui___(UNIQUE_HASH_JOIN_MAX_INNER_SIZE_PER_INSTANCE, "100"),
SDDui___(UNIQUE_HASH_JOIN_MAX_INNER_TABLES, "2"),
DDui___(UNOPTIMIZED_ESP_BUFFER_SIZE_DOWN, "31000"),
DDui___(UNOPTIMIZED_ESP_BUFFER_SIZE_UP, "31000"),
DDui1__(UPDATED_BYTES_PER_ESP, "400000"),
DDkwd__(UPDATE_CLUSTERING_OR_UNIQUE_INDEX_KEY,"ON"),
DDkwd__(UPD_ABORT_ON_ERROR, "OFF"),
XDDkwd__(UPD_ORDERED, "ON"),
DDkwd__(UPD_PARTIAL_ON_ERROR, "OFF"),
DDkwd__(UPD_SAVEPOINT_ON_ERROR, "ON"),
DDkwd__(USER_EXPERIENCE_LEVEL, "BEGINNER"),
// ------------------------------------------------------------------------
// This default will use a new type of an ASSERT, CCMPASSERT as a CMPASSERT
// when ON, else use that as a DCMPASSERT. Changed this default to OFF
// just before the final build for R2 07/23/2004 RV
// -------------------------------------------------------------------------
DDkwd__(USE_CCMPASSERT_AS_CMPASSERT, "OFF"),
// Use Hive tables as source for traf ustat and popindex
DDkwd__(USE_HIVE_SOURCE, ""),
// Use large queues on RHS of Flow/Nested Join when appropriate
DDkwd__(USE_LARGE_QUEUES, "ON"),
XDDkwd__(USE_LIBHDFS, "OFF"),
DDkwd__(USE_LIB_BLOB_STORE, "ON"),
DDkwd__(USE_MAINTAIN_CONTROL_TABLE, "OFF"),
DDkwd__(USE_OLD_DT_CONSTRUCTOR, "OFF"),
// Adaptive segmentation, use operator max to determine degree of parallelism
DDui___(USE_OPERATOR_MAX_FOR_DOP, "1"),
// Specify the number of partitions before invoking parallel label operations
DDui1__(USE_PARALLEL_FOR_NUM_PARTITIONS, "32"),
DDkwd__(USTAT_ADD_SALTED_KEY_PREFIXES_FOR_MC, "ON"), // When ON, generate MCs for primary key prefixes as well as full key
// of salted table when ON EVERY KEY or ON EVERY COLUMN is specified.
DDkwd__(USTAT_ATTEMPT_ESP_PARALLELISM, "ON"), // for reading column values
DDkwd__(USTAT_AUTOMATIC_LOGGING, "ON"), // OFF gives same semantics as
// UPDATE STATISTICS LOG OFF, while
// ON gives same semantics as
// UPDATE STATISTICS LOG SYSTEM
DDui___(USTAT_AUTOMATION_INTERVAL, "0"),
DDkwd__(USTAT_AUTO_EMPTYHIST_TWO_TRANS, "OFF"), // When ON empty hist insert will be 2 trans.
DDkwd__(USTAT_AUTO_FOR_VOLATILE_TABLES, "OFF"), // Toggle for vol tbl histogram usage
DDui1__(USTAT_AUTO_MC_MAX_WIDTH, "10"), // The max columns in an MC histogram for automation.
DDui___(USTAT_AUTO_MISSING_STATS_LEVEL, "4"), // Similar to HIST_MISSING_STATS_WARNING_LEVEL, but controls
// if automation inserts missing stats to HISTOGRAMS table.
// 0 - insert no stats,
// 1 - insert single col hists,
// 2 - insert all single col hists and MC hists for scans,
// 3 - insert all single col hists and MC stats for scans and joins.
// 4 - insert all single col hists and MC stats for scans, joins, and groupbys.
DDui1__(USTAT_AUTO_READTIME_UPDATE_INTERVAL, "86400"), // Seconds between updates of READ_COUNT.
// Should be > CACHE_HISTOGRAMS_REFRESH_INTERVAL.
DDkwd__(USTAT_COLLECT_FILE_STATS, "ON"), // do we collect file stats
DDkwd__(USTAT_COLLECT_MC_SKEW_VALUES, "OFF"),
DDkwd__(USTAT_COMPACT_VARCHARS, "OFF"), // If on, internal sort does not pad out varchars
DD_____(USTAT_CQDS_ALLOWED_FOR_SPAWNED_COMPILERS, ""), // list of CQDs that can be pushed to seconday compilers
// CQDs are delimited by ","
DD_____(USTAT_DEBUG_TEST, ""),
DDkwd__(USTAT_DELETE_NO_ROLLBACK, "ON"), // If ON, use DELETE WITH NO ROLLBACK in IUS when updating sample table
DDflte_(USTAT_DSHMAX, "50.0"),
DDkwd__(USTAT_ESTIMATE_HBASE_ROW_COUNT, "ON"),
DDkwd__(USTAT_FETCHCOUNT_ACTIVE, "OFF"),
DDkwd__(USTAT_FORCE_MOM_ESTIMATOR, "OFF"),
DDkwd__(USTAT_FORCE_TEMP, "OFF"),
DDflt0_(USTAT_FREQ_SIZE_PERCENT, "0.5"), // >100 effectively disables
DDflt0_(USTAT_GAP_PERCENT, "10.0"),
DDflt0_(USTAT_GAP_SIZE_MULTIPLIER, "1.5"),
DDui___(USTAT_HBASE_SAMPLE_RETURN_INTERVAL, "10000000"), // Avoid scanner timeout by including on average at
// least one row per this many when sampling within HBase.
DDflt0_(USTAT_INCREMENTAL_FALSE_PROBABILITY, "0.01"),
DDkwd__(USTAT_INCREMENTAL_UPDATE_STATISTICS, "SAMPLE"), // "SAMPLE" ==> don't use Counting Bloom Filters
DDkwd__(USTAT_INTERNAL_SORT, "HYBRID"),
DDkwd__(USTAT_IS_IGNORE_UEC_FOR_MC, "OFF"), // if MCIS is ON, use IS to compute SC stats
DDflt_0_1(USTAT_IS_MEMORY_FRACTION, "0.6"),
DDflt0_(USTAT_IUS_INTERVAL_ROWCOUNT_CHANGE_THRESHOLD, "0.05"),
DDflt0_(USTAT_IUS_INTERVAL_UEC_CHANGE_THRESHOLD, "0.05"),
DDui1_6(USTAT_IUS_MAX_NUM_HASH_FUNCS, "5"),
// the max disk space IUS CBFs can use is
// MINOF(USTAT_IUS_MAX_PERSISTENT_DATA_IN_MB,
// TtotalSpace * USTAT_IUS_MAX_PERSISTENT_DATA_IN_PERCENTAGE)
DDui___(USTAT_IUS_MAX_PERSISTENT_DATA_IN_MB, "50000"), // 50GB
DDflt0_(USTAT_IUS_MAX_PERSISTENT_DATA_IN_PERCENTAGE, "0.20"), // 20% of the total
DDui1_6(USTAT_IUS_MAX_TRANSACTION_DURATION, "5"), // in minutes
DDkwd__(USTAT_IUS_NO_BLOCK, "OFF"),
DDansi_(USTAT_IUS_PERSISTENT_CBF_PATH, "SYSTEM"),
DDflt0_(USTAT_IUS_TOTAL_ROWCOUNT_CHANGE_THRESHOLD, "0.05"),
DDflt0_(USTAT_IUS_TOTAL_UEC_CHANGE_THRESHOLD, "0.05"),
DDkwd__(USTAT_IUS_USE_PERIODIC_SAMPLING, "OFF"),
DDkwd__(USTAT_JIT_LOGGING, "OFF"),
DD_____(USTAT_LOG, ""), // if non-empty, gives second qualifier to ustat log file name
DDui30_246(USTAT_MAX_CHAR_BOUNDARY_LEN, "30"), // Values can be 30-246.
DDui___(USTAT_MAX_CHAR_COL_LENGTH_IN_BYTES, "256"), // When computing UECs, char cols are limited to this many bytes
DDflt0_ (USTAT_MAX_CHAR_DATASIZE_FOR_IS, "1000"), // max data size in MB for char type to use
XDDui___(USTAT_MAX_READ_AGE_IN_MIN, "5760"),
// internal sort without checking UEC.
DDflt0_(USTAT_MIN_CHAR_UEC_FOR_IS, "0.2"), // minimum UEC for char type to use internal sort
DDflt0_(USTAT_MIN_DEC_BIN_UEC_FOR_IS, "0.0"), // minimum UEC for binary types to use internal sort
DDflt0_(USTAT_MIN_ESTIMATE_FOR_ROWCOUNT, "10000000"),
XDDui1__(USTAT_MIN_ROWCOUNT_FOR_LOW_SAMPLE, "1000000"),
XDDui1__(USTAT_MIN_ROWCOUNT_FOR_SAMPLE, "10000"),
DDflt0_(USTAT_MODIFY_DEFAULT_UEC, "0.05"),
DDui1__(USTAT_MULTI_COLUMN_LIMIT, "10"),
DDflt0_(USTAT_NAHEAP_ESTIMATED_MAX, "1.3"), // estimated max memory allocation (in GB) feasible with NAHEAP.
DDui1__(USTAT_NUM_MC_GROUPS_FOR_KEYS, "10"),
DDkwd__(USTAT_PROCESS_GAPS, "ON"),
DD0_255(USTAT_RETRY_DELAY, "100"),
DD0_255(USTAT_RETRY_LIMIT, "3"),
DD0_255(USTAT_RETRY_NEC_COLS_LIMIT, "3"), // by default, use retry for AddNecessaryColumns
DDpct__(USTAT_SAMPLE_PERCENT_DIFF, "10"),
DDansi_(USTAT_SAMPLE_TABLE_NAME, " "),
DDansi_(USTAT_SAMPLE_TABLE_NAME_CREATE, " "),
DDkwd__(USTAT_SHOW_MC_INTERVAL_INFO, "OFF"),
DDkwd__(USTAT_SHOW_MFV_INFO, "OFF"),
DDflte_(USTAT_UEC_HI_RATIO, "0.5"),
DDflte_(USTAT_UEC_LOW_RATIO, "0.1"),
DDkwd__(USTAT_USE_BACKING_SAMPLE, "OFF"),
DDkwd__(USTAT_USE_BULK_LOAD, "OFF"),
DDkwd__(USTAT_USE_GROUPING_FOR_SAMPLING, "ON"),
DDkwd__(USTAT_USE_INTERNAL_SORT_FOR_MC, "ON"),
DDkwd__(USTAT_USE_IS_WHEN_NO_STATS, "ON"), // use IS when no histograms exist for the column
DDkwd__(USTAT_USE_SLIDING_SAMPLE_RATIO, "ON"), // Trend sampling rate down w/increasing table size, going
// flat at 1%.
XDDflt1_(USTAT_YOULL_LIKELY_BE_SORRY, "100000000"), // guard against unintentional long-running UPDATE STATS
DDkwd__(VALIDATE_VIEWS_AT_OPEN_TIME, "OFF"),
//this is the default length of a param which is typed as a VARCHAR.
DD1_4096(VARCHAR_PARAM_DEFAULT_SIZE, "255"),
// allows pcodes for varchars
DDkwd__(VARCHAR_PCODE, "ON"),
DDansi_(VOLATILE_CATALOG, ""),
DDkwd__(VOLATILE_SCHEMA_IN_USE, "OFF"),
// if this is set to ON or SYSTEM, then find a suitable key among all the
// columns of a volatile table.
// If this is set to OFF, and there is no user specified primary key or
// store by clause, then make the first column of the volatile table
// to be the clustering key.
DDkwd__(VOLATILE_TABLE_FIND_SUITABLE_KEY, "SYSTEM"),
DDkwd__(VSBB_TEST_MODE, "OFF"),
XDDkwd__(WMS_CHILD_QUERY_MONITORING, "OFF"),
XDDkwd__(WMS_QUERY_MONITORING, "OFF"),
// amount of work we are willing to assign per CPU for any query
// not running at full system parallelism
SDDflte_(WORK_UNIT_ESP, "0.08"),
SDDflte_(WORK_UNIT_ESP_DATA_COPY_COST, "0.001"),
// ZIG_ZAG_TREES ON means do ZIG_ZAG_TREES
// $$$ OFF for beta
DDkwd__(ZIG_ZAG_TREES, "SYSTEM"),
DDkwd__(ZIG_ZAG_TREES_CONTROL, "OFF")
};
const char **NADefaults::defaultsWithCQDsFromDefaultsTable_ = NULL;
DefaultToken **NADefaults::tokensWithCQDsFromDefaultsTable_ = NULL;
char *NADefaults::provenancesWithCQDsFromDefaultsTable_ = NULL;
float **NADefaults::floatsWithCQDsFromDefaultsTable_ = NULL;
NABoolean NADefaults::readFromDefaultsTable_ = FALSE;
//
// NOTE: The defDefIx_ array is an array of integers that map
// 'enum' values to defaultDefaults[] entries.
// The defDefIx_ array could probably be made global static
// since all threads should map the same 'enum' values to the
// same defaultDefaults[] entries. Such as change is being
// left to a future round of optimizations.
//
static THREAD_P size_t defDefIx_[__NUM_DEFAULT_ATTRIBUTES];
inline static const char *getAttrName(Int32 attrEnum)
{
return defaultDefaults[defDefIx_[attrEnum]].attrName;
}
inline static const char *getDefaultDefaultValue(Int32 attrEnum)
{
return defaultDefaults[defDefIx_[attrEnum]].value;
}
inline static const DefaultValidator *validator(Int32 attrEnum)
{
return defaultDefaults[defDefIx_[attrEnum]].validator;
}
inline static UInt32 getFlags(Int32 attrEnum)
{
return defaultDefaults[defDefIx_[attrEnum]].flags;
}
inline static NABoolean isFlagOn(Int32 attrEnum, NADefaultFlags flagbit)
{
return defaultDefaults[defDefIx_[attrEnum]].flags & (UInt32)flagbit;
}
inline static void setFlagOn(Int32 attrEnum, NADefaultFlags flagbit)
{
defaultDefaults[defDefIx_[attrEnum]].flags |= (UInt32)flagbit;
}
static NABoolean isSynonymOfRESET(NAString &value)
{
return (value == "RESET");
}
static NABoolean isSynonymOfSYSTEM(Int32 attrEnum, NAString &value)
{
if (value == "")
return TRUE;
if (value == "SYSTEM")
return !isFlagOn(attrEnum, DEFAULT_ALLOWS_SEPARATE_SYSTEM);
if (value == "ENABLE"){
value = "ON";
return FALSE;
}
else if (value == "DISABLE"){
value = "OFF";
return FALSE;
}
// if (getDefaultDefaultValue(attrEnum) != NAString("DISABLE")) // cast reqd!!
// return TRUE;
// else
// value = "ON";
return FALSE;
}
// Helper class used for holding and restoring CQDs
class NADefaults::HeldDefaults
{
public:
HeldDefaults(void);
~HeldDefaults(void);
// CMPASSERT's on stack overflow
void pushDefault(const char * value);
// returns null if nothing to pop
char * popDefault(void);
private:
enum { STACK_SIZE = 3 };
int stackPointer_;
char * stackValue_[STACK_SIZE];
};
// Methods for helper class HeldDefaults
NADefaults::HeldDefaults::HeldDefaults(void) : stackPointer_(0)
{
for (int i = 0; i < STACK_SIZE; i++)
stackValue_[i] = NULL;
}
NADefaults::HeldDefaults::~HeldDefaults(void)
{
for (int i = 0; i < STACK_SIZE; i++)
{
if (stackValue_[i])
{
NADELETEBASIC(stackValue_[i], NADHEAP);
}
}
}
// CMPASSERT's on stack overflow
void NADefaults::HeldDefaults::pushDefault(const char * value)
{
CMPASSERT(stackPointer_ < STACK_SIZE);
stackValue_[stackPointer_] = new NADHEAP char[strlen(value) + 1];
strcpy(stackValue_[stackPointer_],value);
stackPointer_++;
}
// returns null if nothing to pop
char * NADefaults::HeldDefaults::popDefault(void)
{
char * result = 0;
if (stackPointer_ > 0)
{
stackPointer_--;
result = stackValue_[stackPointer_];
stackValue_[stackPointer_] = NULL;
}
return result;
}
size_t NADefaults::numDefaultAttributes()
{
return (size_t)__NUM_DEFAULT_ATTRIBUTES;
}
// Returns current defaults in alphabetic order (for SHOWCONTROL listing).
const char *NADefaults::getCurrentDefaultsAttrNameAndValue(
size_t ix, const char* &name, const char* &value,
NABoolean userDefaultsOnly)
{
if (ix < numDefaultAttributes()) {
NABoolean get = FALSE;
if (userDefaultsOnly)
{
// if this default was entered by user, return it.
get = userDefault(defaultDefaults[ix].attrEnum);
}
else
{
// display the control if
// - it is externalized or
// - it is for support only and a CQD is set to show those, or
// - a CQD is set to show all the controls
get =
(defaultDefaults[ix].flags & DEFAULT_IS_EXTERNALIZED) || // bit-AND
((defaultDefaults[ix].flags & DEFAULT_IS_FOR_SUPPORT) &&
(getToken(SHOWCONTROL_SHOW_SUPPORT) == DF_ON)) ||
(getToken(SHOWCONTROL_SHOW_ALL) == DF_ON);
}
if (get) {
name = defaultDefaults[ix].attrName;
value = currentDefaults_[defaultDefaults[ix].attrEnum];
return name;
}
}
return name = value = NULL;
}
// -----------------------------------------------------------------------
// convert the default defaults into a table organized by enum values
// -----------------------------------------------------------------------
void NADefaults::initCurrentDefaultsWithDefaultDefaults()
{
// It is important that the currentDefaults_ array elements are initialized with DefaultsDefaults
// static constant values or values allocated using cli_gloabsl->exCollHeap().
// Keyword tokens are populated once in currentTokens_ and saved off similar to currentDefaults_.
// Hence currentTokens_ array elements are allocated from cli_globals->exCollHeap().
// INIT_DEFAULT_DEFAULT provenance means scope is process level for the elements of these
// two arrays. The elements with this scope from these 2 arrays should never be
// deallocated.
const size_t numAttrs = numDefaultAttributes();
if (numAttrs != sizeof(defaultDefaults) / sizeof(DefaultDefault))
return;
CMPASSERT_STRING
(numAttrs == sizeof(defaultDefaults) / sizeof(DefaultDefault),
"Check sqlcomp/DefaultConstants.h for a gap in enum DefaultConstants or sqlcomp/nadefaults.cpp for duplicate entries in array defaultDefaults[].");
SqlParser_NADefaults_Glob =
SqlParser_NADefaults_ = new NADHEAP SqlParser_NADefaults();
provenances_ = new NADHEAP char [numAttrs]; // enum fits in 2 bits
flags_ = new NADHEAP char [numAttrs];
resetToDefaults_ = new NADHEAP char * [numAttrs];
currentDefaults_ = new NADHEAP const char * [numAttrs];
currentFloats_ = new NADHEAP float * [numAttrs];
currentTokens_ = new NADHEAP DefaultToken * [numAttrs];
currentState_ = INIT_DEFAULT_DEFAULTS;
heldDefaults_ = new NADHEAP HeldDefaults * [numAttrs];
// reset all entries
size_t i = 0;
for (i = 0; i < numAttrs; i++)
{
provenances_[i] = currentState_;
flags_[i] = 0;
defDefIx_[i] = 0;
}
memset( resetToDefaults_, 0, sizeof(char *) * numAttrs );
memset( currentDefaults_, 0, sizeof(char *) * numAttrs );
memset( currentFloats_, 0, sizeof(float *) * numAttrs );
memset( currentTokens_, 0, sizeof(DefaultToken *) * numAttrs );
memset( heldDefaults_, 0, sizeof(HeldDefaults *) * numAttrs );
#ifndef NDEBUG
// This env-var turns on consistency checking of default-defaults and
// other static info. The env-var does not get passed from sqlci to arkdev
// until *AFTER* the initialization code runs, so you must do a static
// arkcmp compile to do this checking. TEST050 does this, in fact.
NABoolean nadval = !!getenv("NADEFAULTS_VALIDATE");
#endif
// for each entry of the (alphabetically sorted) default defaults
// table, enter the default default into the current default table
// which is sorted by enum values
NAString prevAttrName;
for (i = 0; i < numAttrs; i++)
{
// the enum must be less than the max (if this assert fails
// you might have made the range of constants in the enum
// non-contiguous by assigning hard-coded numbers to some entries)
CMPASSERT(ENUM_RANGE_CHECK(defaultDefaults[i].attrEnum));
// can't have the same enum value twice in defaultDefaults
CMPASSERT(currentDefaults_[defaultDefaults[i].attrEnum] == NULL);
currentDefaults_[defaultDefaults[i].attrEnum] = defaultDefaults[i].value;
// set up our backlink which maps [enum] to its defaultDefaults entry
defDefIx_[defaultDefaults[i].attrEnum] = i;
// attrs must be in ascending sorted order. If not, error out.
if (prevAttrName > defaultDefaults[i].attrName)
{
SqlParser_NADefaults_ = NULL;
return;
}
prevAttrName = defaultDefaults[i].attrName;
// validate initial default default values
CMPASSERT(defaultDefaults[i].validator);
if (! defaultDefaults[i].validator->validate(
defaultDefaults[i].value,
this,
defaultDefaults[i].attrEnum,
+1/*warning*/))
{
SqlParser_NADefaults_ = NULL;
cerr << "\nERROR: " << defaultDefaults[i].attrName
<< " has invalid value" << defaultDefaults[i].value << endl;
return;
}
// for debugging only
#ifndef NDEBUG
if (nadval) { // additional sanity checking we want to do occasionally
NAString v;
// ensure the static table really is in alphabetic order
CMPASSERT(i == 0 ||
strcmp(defaultDefaults[i-1].attrName,
defaultDefaults[i].attrName) < 0);
// ensure these names are fit and trim and in canonical form
v = defaultDefaults[i].attrName;
TrimNAStringSpace(v);
v.toUpper();
CMPASSERT(v == defaultDefaults[i].attrName);
// validate initial default default values
CMPASSERT(defaultDefaults[i].validator);
defaultDefaults[i].validator->validate(
defaultDefaults[i].value,
this,
defaultDefaults[i].attrEnum,
+1/*warning*/);
// ensure these values are fit and trim and in canonical form
v = defaultDefaults[i].value;
TrimNAStringSpace(v);
defaultDefaults[i].validator->applyUpper(v);
CMPASSERT(v == defaultDefaults[i].value);
// alert the programmer
if (isSynonymOfSYSTEM(defaultDefaults[i].attrEnum, v))
if (v != "" || defaultDefaults[i].validator != &validateAnsiName)
cerr << "\nWARNING: " << defaultDefaults[i].attrName
<< " has SYSTEM default ("
<< v << ");\n\t read NOTE 2 in " << __FILE__ << endl;
if (isSynonymOfRESET(v))
if (v != "" || defaultDefaults[i].validator != &validateAnsiName)
cerr << "\nWARNING: " << defaultDefaults[i].attrName
<< " has RESET default ("
<< v << ");\n\t this makes no sense!" << endl;
if (defaultDefaults[i].validator == &validateUnknown)
cerr << "\nWARNING: " << defaultDefaults[i].attrName
<< " has a NO-OP validator" << endl;
// the token keyword array must have no missing strings,
// it must also be in alphabetic order,
// each entry must be canonical, and
// must have no embedded spaces (see token() method, space/uscore...)
if (i == 0)
for (size_t j = 0; j < DF_lastToken; j++) {
CMPASSERT(keywords_[j]);
CMPASSERT(j == 0 || strcmp(keywords_[j-1], keywords_[j]) < 0);
NAString v(keywords_[j]);
TrimNAStringSpace(v);
v.toUpper(); // we know keywords must be caseINsens
CMPASSERT(v == keywords_[j]);
CMPASSERT(v.first(' ') == NA_NPOS);
}
} // if env-var
#endif // NDEBUG
} // for i
// set the default value for GENERATE_EXPLAIN depending on whether
// this is a static compile or a dynamic compile.
if (CmpCommon::context()->GetMode() == STMT_STATIC)
{
currentDefaults_[GENERATE_EXPLAIN] = "ON";
}
else
{
currentDefaults_[GENERATE_EXPLAIN] = "OFF";
currentDefaults_[DETAILED_STATISTICS] = "OPERATOR";
}
// set the default value of hive_catalog to the hive_system_catalog
currentDefaults_[HIVE_CATALOG] = HIVE_SYSTEM_CATALOG;
// set the default value of hbase_catalog to the hbase_system_catalog
currentDefaults_[HBASE_CATALOG] = HBASE_SYSTEM_CATALOG;
currentDefaults_[SEABASE_CATALOG] = TRAFODION_SYSCAT_LIT;
// Test for TM_USE_SSCC from ms.env.
// Only a setting of TM_USE_SSCC set to 1 will change the value to SSCC.
// Otherwise, the default will remain at MVCC.
char * ev = getenv("TM_USE_SSCC");
Lng32 useValue = 0;
if (ev) {
useValue = (Lng32)str_atoi(ev, str_len(ev));
if (useValue == 1)
currentDefaults_[TRAF_TRANS_TYPE] = "SSCC";
}
// Begin: Temporary workaround for SQL build regressions to pass
NABoolean resetNeoDefaults = FALSE;
// On SQ, the way to get an envvar from inside a un-attached process
// is to use the msg_getenv_str() call and set the env inside
// the SQ_PROP_ property file. In this case the property
// file is $TRAF_CONF/tdm_arkcmp.env which contains the line
// "SQLMX_REGRESS=1". This file was generated by tools/setuplnxenv.
// resetNeoDefaults = (msg_getenv_str("SQLMX_REGRESS") != NULL);
resetNeoDefaults = (getenv("SQLMX_REGRESS") != NULL);
if(resetNeoDefaults)
{
// turn on INTERNAL format for SHOWDDL statements
currentDefaults_[SHOWDDL_DISPLAY_FORMAT] = "INTERNAL";
}
// End: Temporary workaround for SQL build regressions to pass
// leaving other non-keyword token to be cached on demand.
// Some of the keywords corresponding to attribute like NATIONAL_CHARSET
// are not cached.
// Use Globals heap so that it can be saved off
NAHeap *heap = (NAHeap *)GetCliGlobals()->exCollHeap();
NAString tmp( heap );
for ( i = 0; i < numAttrs; i++ )
{
#ifndef NDEBUG
const DefaultValidatorType validatorType = validator(i)->getType();
#endif
if ( validator(i)->getType() == VALID_KWD && (i != NATIONAL_CHARSET) &&
(i != INPUT_CHARSET) && (i != ISO_MAPPING) )
{
currentTokens_[i] = new (heap) DefaultToken;
// do not call 'token' method as it will return an error if FALSE
// is to be inserted. Just directly assign DF_OFF to non-resetable defs.
if (isNonResetableAttribute(defaultDefaults[defDefIx_[i]].attrName))
*currentTokens_[i] = DF_OFF;
else
*currentTokens_[i] = token( i, tmp );
}
}
if (getToken(SEABASE_VOLATILE_TABLES) == DF_ON) {
NAString sbCat = getValue(SEABASE_CATALOG);
CmpCommon::context()->sqlSession()->setVolatileCatalogName(sbCat, TRUE);
}
SqlParser_NADefaults_->NAMETYPE_ = getToken(NAMETYPE);
SqlParser_NADefaults_->NATIONAL_CHARSET_ =
CharInfo::getCharSetEnum(currentDefaults_[NATIONAL_CHARSET]);
SqlParser_NADefaults_->ISO_MAPPING_ =
CharInfo::getCharSetEnum(currentDefaults_[ISO_MAPPING]);
SqlParser_NADefaults_->DEFAULT_CHARSET_ =
CharInfo::getCharSetEnum(currentDefaults_[DEFAULT_CHARSET]);
SqlParser_NADefaults_->ORIG_DEFAULT_CHARSET_ =
CharInfo::getCharSetEnum(currentDefaults_[DEFAULT_CHARSET]);
// Set the NAString_isoMappingCS memory cache for use by routines
// ToInternalIdentifier() and ToAnsiIdentifier[2|3]() in module
// w:/common/NAString[2].cpp. These routines currently cannot
// access SqlParser_ISO_MAPPING directly due to the complex
// build hierarchy.
NAString_setIsoMapCS((SQLCHARSET_CODE) SqlParser_NADefaults_->ISO_MAPPING_);
}
void NADefaults::saveCurrentDefaults()
{
NAHeap *heap = (NAHeap *)GetCliGlobals()->exCollHeap();
const size_t numAttrs = numDefaultAttributes();
provenancesWithCQDsFromDefaultsTable_ = new (heap) char [numAttrs]; // enum fits in 2 bits
tokensWithCQDsFromDefaultsTable_ = new (heap) DefaultToken * [numAttrs];
defaultsWithCQDsFromDefaultsTable_ = new (heap) const char * [numAttrs];
// floats are not cached currently - Reserved for future use
floatsWithCQDsFromDefaultsTable_ = new (heap) float * [numAttrs];
for (int i = 0; i < numAttrs; i++) {
provenancesWithCQDsFromDefaultsTable_[i] = provenances_[i];
char *value;
if (provenances_[i] > INIT_DEFAULT_DEFAULTS) {
value = new (heap) char[strlen(currentDefaults_[i]) + 1];
strcpy(value,currentDefaults_[i]);
}
else {
value = (char *)currentDefaults_[i];
}
defaultsWithCQDsFromDefaultsTable_[i] = value;
if (currentTokens_[i] != NULL) {
if (provenances_[i] > INIT_DEFAULT_DEFAULTS) {
tokensWithCQDsFromDefaultsTable_[i] = new (heap) DefaultToken;
*tokensWithCQDsFromDefaultsTable_[i] = *currentTokens_[i];
}
else
tokensWithCQDsFromDefaultsTable_[i] = currentTokens_[i];
}
else
tokensWithCQDsFromDefaultsTable_[i] = NULL;
if (currentFloats_[i] != NULL) {
floatsWithCQDsFromDefaultsTable_[i] = new (heap) float;
*floatsWithCQDsFromDefaultsTable_[i] = *currentFloats_[i];
}
else
floatsWithCQDsFromDefaultsTable_[i] = NULL;
}
}
void NADefaults::initCurrentDefaultsFromSavedDefaults()
{
const size_t numAttrs = numDefaultAttributes();
SqlParser_NADefaults_Glob =
SqlParser_NADefaults_ = new NADHEAP SqlParser_NADefaults();
provenances_ = new NADHEAP char [numAttrs]; // enum fits in 2 bits
flags_ = new NADHEAP char [numAttrs];
resetToDefaults_ = new NADHEAP char * [numAttrs];
currentDefaults_ = new NADHEAP const char * [numAttrs];
currentFloats_ = new NADHEAP float * [numAttrs];
currentTokens_ = new NADHEAP DefaultToken * [numAttrs];
currentState_ = INIT_DEFAULT_DEFAULTS;
heldDefaults_ = new NADHEAP HeldDefaults * [numAttrs];
memset( resetToDefaults_, 0, sizeof(char *) * numAttrs );
memset( heldDefaults_, 0, sizeof(HeldDefaults *) * numAttrs );
for (int i = 0; i < numAttrs; i++) {
provenances_[i] = provenancesWithCQDsFromDefaultsTable_[i];
flags_[i] = 0;
char *value;
if (provenances_[i] > INIT_DEFAULT_DEFAULTS) {
value = new NADHEAP char[strlen(defaultsWithCQDsFromDefaultsTable_[i]) + 1];
strcpy(value,defaultsWithCQDsFromDefaultsTable_[i]);
}
else
value = (char *)defaultsWithCQDsFromDefaultsTable_[i];
currentDefaults_[i] = value;
if (provenances_[i] == READ_FROM_SQL_TABLE) {
if (tokensWithCQDsFromDefaultsTable_[i] != NULL) {
currentTokens_[i] = new NADHEAP DefaultToken;
*currentTokens_[i] = *tokensWithCQDsFromDefaultsTable_[i];
}
else
currentTokens_[i] = tokensWithCQDsFromDefaultsTable_[i];
if (floatsWithCQDsFromDefaultsTable_[i] != NULL) {
currentFloats_[i] = new NADHEAP float;
*currentFloats_[i] = *floatsWithCQDsFromDefaultsTable_[i];
}
else
currentFloats_[i] = floatsWithCQDsFromDefaultsTable_[i];
}
else {
currentTokens_[i] = tokensWithCQDsFromDefaultsTable_[i];
currentFloats_[i] = floatsWithCQDsFromDefaultsTable_[i];
}
}
currentState_ = SET_BY_CQD; // enter the next state...
NAString sbCat = getValue(SEABASE_CATALOG);
CmpCommon::context()->sqlSession()->setVolatileCatalogName(sbCat, TRUE);
SqlParser_NADefaults_->NAMETYPE_ = getToken(NAMETYPE);
SqlParser_NADefaults_->NATIONAL_CHARSET_ = CharInfo::getCharSetEnum(currentDefaults_[NATIONAL_CHARSET]);
SqlParser_NADefaults_->ISO_MAPPING_ = CharInfo::getCharSetEnum(currentDefaults_[ISO_MAPPING]);
SqlParser_NADefaults_->DEFAULT_CHARSET_ = CharInfo::getCharSetEnum(currentDefaults_[DEFAULT_CHARSET]);
// Set the NAString_isoMappingCS memory cache for use by routines
// ToInternalIdentifier() and ToAnsiIdentifier[2|3]()
// These routines currently cannot access SqlParser_ISO_MAPPING directly due to the complex
// build hierarchy.
NAString_setIsoMapCS((SQLCHARSET_CODE) SqlParser_NADefaults_->ISO_MAPPING_);
}
NADefaults::NADefaults(NAMemory * h)
: provenances_(NULL)
, flags_(NULL)
, resetToDefaults_(NULL)
, currentDefaults_(NULL)
, currentFloats_(NULL)
, currentTokens_(NULL)
, heldDefaults_(NULL)
, currentState_(UNINITIALIZED)
, SqlParser_NADefaults_(NULL)
, catSchSetToUserID_(0)
, heap_(h)
, resetAll_(FALSE)
, defFlags_(0)
{
static THREAD_P NABoolean systemParamterUpdated = FALSE;
// First (but only if NSK-LITE Services exist),
// write system parameters (attributes DEF_*) into DefaultDefaults,
if (!systemParamterUpdated && !cmpCurrentContext->isStandalone())
{
updateSystemParameters();
systemParamterUpdated = TRUE;
}
if (readFromDefaultsTable_) {
initCurrentDefaultsFromSavedDefaults();
readFromDefaultsTable();
}
else {
globalSemaphore.get();
if (readFromDefaultsTable_) {
globalSemaphore.release();
initCurrentDefaultsFromSavedDefaults();
readFromDefaultsTable();
} else {
initCurrentDefaultsWithDefaultDefaults();
readFromDefaultsTable();
saveCurrentDefaults();
readFromDefaultsTable_ = TRUE;
globalSemaphore.release();
}
}
// Set additional defaultDefaults flags:
// If an attr allows ON/OFF/SYSTEM and the default-default is not SYSTEM,
// then you must set this flag. Otherwise, CQD attr 'system' will revert
// the value back to the default-default, which is not SYSTEM.
// setFlagOn(...attr..., DEFAULT_ALLOWS_SEPARATE_SYSTEM);
//
// (See attESPPara in OptPhysRelExpr.cpp.)
setFlagOn(ATTEMPT_ESP_PARALLELISM, DEFAULT_ALLOWS_SEPARATE_SYSTEM);
setFlagOn(HJ_TYPE, DEFAULT_ALLOWS_SEPARATE_SYSTEM);
setFlagOn(ZIG_ZAG_TREES, DEFAULT_ALLOWS_SEPARATE_SYSTEM);
setFlagOn(COMPRESSED_INTERNAL_FORMAT, DEFAULT_ALLOWS_SEPARATE_SYSTEM);
setFlagOn(COMPRESSED_INTERNAL_FORMAT_BMO, DEFAULT_ALLOWS_SEPARATE_SYSTEM);
setFlagOn(HBASE_SMALL_SCANNER, DEFAULT_ALLOWS_SEPARATE_SYSTEM);
}
NADefaults::~NADefaults()
{
deleteMe();
}
void NADefaults::deleteMe()
{
if (resetToDefaults_) {
for (size_t i = numDefaultAttributes(); i--; )
NADELETEBASIC(resetToDefaults_[i], NADHEAP);
NADELETEBASIC(resetToDefaults_, NADHEAP);
resetToDefaults_ = NULL;
}
if (currentDefaults_) {
for (size_t i = numDefaultAttributes(); i--; )
if (provenances_[i] > INIT_DEFAULT_DEFAULTS)
NADELETEBASIC(currentDefaults_[i], NADHEAP);
NADELETEBASIC(currentDefaults_, NADHEAP);
currentDefaults_ = NULL;
}
if (currentFloats_) {
for (size_t i = numDefaultAttributes(); i--; )
NADELETEBASIC(currentFloats_[i], NADHEAP);
NADELETEBASIC(currentFloats_, NADHEAP);
currentFloats_ = NULL;
}
if (currentTokens_) {
for (size_t i = numDefaultAttributes(); i--; )
if (provenances_[i] > INIT_DEFAULT_DEFAULTS)
NADELETEBASIC(currentTokens_[i], NADHEAP);
NADELETEBASIC(currentTokens_, NADHEAP);
currentTokens_ = NULL;
}
if (heldDefaults_) {
for (size_t i = numDefaultAttributes(); i--; )
NADELETE(heldDefaults_[i], HeldDefaults, NADHEAP);
NADELETEBASIC(heldDefaults_, NADHEAP);
heldDefaults_ = NULL;
}
if (provenances_ != NULL) {
NADELETEBASIC(provenances_, NADHEAP);
provenances_ = NULL;
}
if (flags_ != NULL) {
NADELETEBASIC(flags_, NADHEAP);
flags_ = NULL;
}
if (SqlParser_NADefaults_ != NULL) {
NADELETE(SqlParser_NADefaults_, SqlParser_NADefaults, NADHEAP);
SqlParser_NADefaults_ = NULL;
}
}
// -----------------------------------------------------------------------
// Find the attribute name from its enum value in the defaults table.
// -----------------------------------------------------------------------
const char *NADefaults::lookupAttrName(Int32 attrEnum,
Int32 errOrWarn)
{
if (ATTR_RANGE_CHECK) return getAttrName(attrEnum);
static THREAD_P char noSuchAttr[20];
sprintf(noSuchAttr, "**%d**", attrEnum);
if (errOrWarn) // $0~string0 is not the name of any DEFAULTS table attribute.
*CmpCommon::diags() << DgSqlCode(ERRWARN(2050)) << DgString0(noSuchAttr);
return noSuchAttr;
}
// -----------------------------------------------------------------------
// Find the enum value from its string representation in the defaults table.
// -----------------------------------------------------------------------
enum DefaultConstants NADefaults::lookupAttrName(const char *name,
Int32 errOrWarn,
Int32 *position)
{
NAString attrName(name);
TrimNAStringSpace(attrName, FALSE, TRUE); // trim trailing blanks only
attrName.toUpper();
// start with the full range of defaultDefaults
size_t lo = 0;
size_t hi = numDefaultAttributes();
size_t split;
Int32 cresult;
// perform a binary search in the ordered table defaultDefaults
do
{
// compare the token with the middle entry in the range
split = (lo + hi) / 2;
cresult = attrName.compareTo(defaultDefaults[split].attrName);
if (cresult < 0)
{
// token < split value, search first half of range
hi = split;
}
else if (cresult > 0)
{
if (lo == split) // been there, done that
{
CMPASSERT(lo == hi-1);
break;
}
// token > split value, search second half of range
lo = split;
}
}
while (cresult != 0 && lo < hi);
if (position != 0)
*position = split;
// if the last comparison result was equal, return value at "split"
if (cresult == 0)
return defaultDefaults[split].attrEnum;
// otherwise the string has no corresponding enum value
if (errOrWarn) // $0~string0 is not the name of any DEFAULTS table attribute.
*CmpCommon::diags() << DgSqlCode(ERRWARN(2050)) << DgString0(attrName);
return __INVALID_DEFAULT_ATTRIBUTE; // negative
}
#define WIDEST_CPUARCH_VALUE 30 // also wider than any utoa_() result
static void utoa_(UInt32 val, char *buf) { sprintf(buf, "%u", val); }
static void itoa_(Int32 val, char *buf) { sprintf(buf, "%d", val); }
static void ftoa_(float val, char *buf)
{
snprintf(buf, WIDEST_CPUARCH_VALUE, "%0.2f", val);
}
// Updates the system parameters in the defaultDefaults table.
void NADefaults::updateSystemParameters(NABoolean reInit)
{
static const char *arrayOfSystemParameters[] = {
"DEF_CPU_ARCHITECTURE",
"DEF_DISCS_ON_CLUSTER",
"DEF_INSTRUCTIONS_SECOND",
"DEF_PAGE_SIZE",
"DEF_LOCAL_CLUSTER_NUMBER",
"DEF_LOCAL_SMP_NODE_NUMBER",
"DEF_NUM_SMP_CPUS",
"MAX_ESPS_PER_CPU_PER_OP",
"DEFAULT_DEGREE_OF_PARALLELISM",
"DEF_NUM_NODES_IN_ACTIVE_CLUSTERS",
// this is deliberately not in the list: "DEF_CHUNK_SIZE",
"DEF_NUM_BM_CHUNKS",
"DEF_PHYSICAL_MEMORY_AVAILABLE", //returned in KB not bytes
"DEF_TOTAL_MEMORY_AVAILABLE", //returned in KB not bytes
"DEF_VIRTUAL_MEMORY_AVAILABLE"
, "USTAT_IUS_PERSISTENT_CBF_PATH"
}; //returned in KB not bytes
char valuestr[WIDEST_CPUARCH_VALUE];
// Set up global cluster information.
setUpClusterInfo(CmpCommon::contextHeap());
// Extract SMP node number and cluster number where this arkcmp is running.
short nodeNum = 0;
Int32 clusterNum = 0;
OSIM_getNodeAndClusterNumbers(nodeNum, clusterNum);
// First (but only if NSK-LITE Services exist),
// write system parameters (attributes DEF_*) into DefaultDefaults,
// then copy DefaultDefaults into CurrentDefaults.
if (!cmpCurrentContext->isStandalone()) {
size_t numElements = sizeof(arrayOfSystemParameters) / sizeof(char *);
for (size_t i = 0; i < numElements; i++) {
Int32 j;
// perform a lookup for the string, using a binary search
lookupAttrName(arrayOfSystemParameters[i], -1, &j);
CMPASSERT(j >= 0);
if(reInit)
NADELETEBASIC(defaultDefaults[j].value,NADHEAP);
char *newValue = new (GetCliGlobals()->exCollHeap()) char[WIDEST_CPUARCH_VALUE];
newValue[0] = '\0';
defaultDefaults[j].value = newValue;
switch(defaultDefaults[j].attrEnum) {
case DEF_CPU_ARCHITECTURE:
switch(gpClusterInfo->cpuArchitecture()) {
// 123456789!1234567890@123456789
case CPU_ARCH_INTEL_80386:
strcpy(newValue, "INTEL_80386");
break;
case CPU_ARCH_INTEL_80486:
strcpy(newValue, "INTEL_80486");
break;
case CPU_ARCH_PENTIUM:
strcpy(newValue, "PENTIUM");
break;
case CPU_ARCH_PENTIUM_PRO:
strcpy(newValue, "PENTIUM_PRO");
break;
case CPU_ARCH_MIPS:
strcpy(newValue, "MIPS");
break;
case CPU_ARCH_ALPHA:
strcpy(newValue, "ALPHA");
break;
case CPU_ARCH_PPC:
strcpy(newValue, "PPC");
break;
default:
strcpy(newValue, "UNKNOWN");
break;
}
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j], FALSE);
break;
case DEF_DISCS_ON_CLUSTER:
strcpy(newValue, "8");
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
break;
case DEF_PAGE_SIZE:
utoa_(gpClusterInfo->pageSize(), valuestr);
strcpy(newValue, valuestr);
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
break;
case DEF_LOCAL_CLUSTER_NUMBER:
utoa_(clusterNum, valuestr);
strcpy(newValue, valuestr);
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
break;
case DEF_LOCAL_SMP_NODE_NUMBER:
utoa_(nodeNum, valuestr);
strcpy(newValue, valuestr);
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
break;
case DEF_NUM_SMP_CPUS:
utoa_(gpClusterInfo->numberOfCpusPerSMP(), valuestr);
strcpy(newValue, valuestr);
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
break;
case DEFAULT_DEGREE_OF_PARALLELISM:
{
Lng32 x = 2;
utoa_(x, valuestr);
strcpy(newValue, valuestr);
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
}
break;
case MAX_ESPS_PER_CPU_PER_OP:
{
float espsPerCore = computeNumESPsPerCore(FALSE);
ftoa_(espsPerCore, valuestr);
strcpy(newValue, valuestr);
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
}
break;
case DEF_NUM_NODES_IN_ACTIVE_CLUSTERS:
utoa_(gpClusterInfo->numOfPhysicalSMPs(), valuestr);
strcpy(newValue, valuestr);
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
break;
case DEF_PHYSICAL_MEMORY_AVAILABLE:
utoa_(gpClusterInfo->physicalMemoryAvailable(), valuestr);
strcpy(newValue, valuestr);
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
break;
case DEF_TOTAL_MEMORY_AVAILABLE:
utoa_(gpClusterInfo->totalMemoryAvailable(), valuestr);
strcpy(newValue, valuestr);
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
break;
case DEF_VIRTUAL_MEMORY_AVAILABLE:
utoa_(gpClusterInfo->virtualMemoryAvailable(), valuestr);
strcpy(newValue, valuestr);
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
break;
case DEF_NUM_BM_CHUNKS:
{
UInt32 numChunks = (UInt32)
(gpClusterInfo->physicalMemoryAvailable() / def_DEF_CHUNK_SIZE / 4);
utoa_(numChunks, valuestr);
strcpy(newValue, valuestr);
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
}
break;
case DEF_INSTRUCTIONS_SECOND:
{
Int32 frequency, speed;
frequency = gpClusterInfo->processorFrequency();
switch (gpClusterInfo->cpuArchitecture()) {
case CPU_ARCH_PENTIUM_PRO: speed = (Int32) (frequency * 0.5); break;
case CPU_ARCH_PENTIUM: speed = (Int32) (frequency * 0.4); break;
default: speed = (Int32) (frequency * 0.3); break;
}
itoa_(speed, valuestr);
strcpy(newValue, valuestr);
if(reInit)
ActiveSchemaDB()->
getDefaults().
updateCurrentDefaultsForOSIM(&defaultDefaults[j]);
}
break;
case USTAT_IUS_PERSISTENT_CBF_PATH:
{
// set the CQD it to $HOME/cbfs
const char* home = getenv("HOME");
if ( home ) {
str_cat(home, "/cbfs", newValue);
}
}
break;
default:
#ifndef NDEBUG
cerr << "updateSystemParameters: no case for "
<< defaultDefaults[j].attrName << endl;
#endif
break;
} // switch (arrayOfSystemParameters)
} // for
} // isStandalone
} // updateSystemParameters()
//==============================================================================
// Get SMP node number and cluster number on which this arkcmp.exe is running.
//==============================================================================
void
NADefaults::getNodeAndClusterNumbers(short& nodeNum, Int32& clusterNum)
{
SB_Phandle_Type pHandle;
Int32 error = XPROCESSHANDLE_GETMINE_(&pHandle);
Int32 nodeNumInt; // XPROCESSHANDLE_DECOMPOSE_ takes an integer.
Int32 pin;
error = XPROCESSHANDLE_DECOMPOSE_(&pHandle, &nodeNumInt, &pin, &clusterNum);
nodeNum = nodeNumInt; // Store 4-byte integer back to short integer
CMPASSERT(error == 0);
}
inline static NABoolean initializeSQLdone()
{
return FALSE;
}
// Setup for readFromSQLTable():
//
#include "SQLCLIdev.h"
const SQLMODULE_ID __SQL_mod_866668761818000 = {
/* version */ SQLCLI_CURRENT_VERSION,
/* module name */ "HP_SYSTEM_CATALOG.SYSTEM_SCHEMA.READDEF_N29_000",
/* time stamp */ 866668761818000LL,
/* char set */ "ISO88591",
/* name length */ 47
};
void NADefaults::readFromDefaultsTable(Provenance overwriteIfNotYet, Int32 errOrWarn)
{
NABoolean cat = FALSE;
NABoolean sch = FALSE;
if (! readFromDefaultsTable_)
{
CmpSeabaseDDL cmpSBD((NAHeap *)heap_, FALSE);
Lng32 hbaseErr = 0;
NAString hbaseErrStr;
Lng32 errNum = cmpSBD.validateVersions(this, NULL, NULL, NULL,
NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
&hbaseErr, &hbaseErrStr);
if (errNum == 0) // seabase is initialized properly
{
currentState_ = READ_FROM_SQL_TABLE;
// read from seabase defaults table
cmpSBD.readAndInitDefaultsFromSeabaseDefaultsTable
(overwriteIfNotYet, errOrWarn, this);
// set authorization state
NABoolean checkAllPrivTables = FALSE;
errNum = cmpSBD.isPrivMgrMetadataInitialized(this,checkAllPrivTables);
CmpCommon::context()->setAuthorizationState(errNum);
CmpContext::authorizationState_ = errNum;
}
else
{
CmpCommon::context()->setIsUninitializedSeabase(TRUE);
CmpCommon::context()->uninitializedSeabaseErrNum() = errNum;
CmpCommon::context()->hbaseErrNum() = hbaseErr;
CmpCommon::context()->hbaseErrStr() = hbaseErrStr;
}
}
else {
CmpCommon::context()->setAuthorizationState(CmpContext::authorizationState_);
}
currentState_ = SET_BY_CQD; // enter the next state...
} // NADefaults::readFromDefaultsTable()
// This method is used by SchemaDB::initPerStatement
const char * NADefaults::getValueWhileInitializing(Int32 attrEnum)
{
return getValue(attrEnum);
}
// This method is used by SchemaDB::initPerStatement *and*
// by CmpCommon, CmpStatement, and SQLC/SQLCO.
void NADefaults::getCatalogAndSchema(NAString &cat, NAString &sch)
{
cat = getValueWhileInitializing(CATALOG);
sch = getValueWhileInitializing(SCHEMA);
}
// Should be called only privately and by DefaultValidator!
Int32 NADefaults::validateFloat(const char *value, float &result,
Int32 attrEnum, Int32 errOrWarn) const
{
Int32 n = -1; // NT's scanf("%n") is not quite correct; hence this code-around
sscanf(value, "%g%n", &result, &n);
if (n > 0 && value[n] == '\0')
{
switch (attrEnum)
{
case HIVE_INSERT_ERROR_MODE:
{
Lng32 v = str_atoi(value, str_len(value));
if (v >= 0 && v <= 3)
return TRUE;
}
break;
default:
return TRUE; // a valid float
}
}
NAString v(value);
NABoolean silentIf = (errOrWarn == SilentIfSYSTEM);
if (silentIf) errOrWarn = 0/*silent*/;
NABoolean useSYSTEM = (token(attrEnum, v, TRUE, errOrWarn) == DF_SYSTEM);
if (useSYSTEM && silentIf) // ValidateNumeric is caller
return SilentIfSYSTEM; // special it-is-valid return!
if (errOrWarn)
*CmpCommon::diags() << DgSqlCode(ERRWARN(2055))
<< DgString0(value)
<< DgString1(lookupAttrName(attrEnum, errOrWarn));
if (useSYSTEM) { // programmer error
CMPASSERT("Numeric attr allows SYSTEM -- you need to call token() first to see if its current value is this keyword, and compute your system default value!" == NULL);
}
// ensure an out-of-range error if domainMatch or ValidateNumeric is called
result = -FLT_MAX;
return FALSE; // not valid
}
NABoolean NADefaults::insert(Int32 attrEnum, const NAString &value, Int32 errOrWarn)
{
// private method; callers have all already done this: ATTR_RANGE_ASSERT;
assert(errOrWarn != SilentIfSYSTEM); // yeh private, but just in case
// Update cache:
// (Re)validate that new value is numeric.
// Useful if programmer did not correctly specify the DefaultValidator for
// this attr in DefaultDefaults.
//
if (currentFloats_[attrEnum]) {
float result;
if (validateFloat(value, result, attrEnum, errOrWarn))
*currentFloats_[attrEnum] = result;
else
return FALSE; // not a valid float
}
// Update cache for DefaultToken by deallocating the cached entry.
if (currentTokens_[attrEnum] )
{
if ( provenances_[attrEnum] > INIT_DEFAULT_DEFAULTS)
NADELETEBASIC(currentTokens_[attrEnum], NADHEAP );
currentTokens_[attrEnum] = NULL;
}
// If we're past the read-from-SQLTable phase, then
// the first CQD of a given attr must first save the from-SQLTable value,
// to which the user can RESET if desired.
//
if (currentState_ >= SET_BY_CQD && !resetToDefaults_[attrEnum]) {
NAString currValStr(currentDefaults_[attrEnum]);
Lng32 currValLen = str_len(currValStr) + 1;
char *pCurrVal = new NADHEAP char[currValLen];
str_cpy_all(pCurrVal, currValStr, currValLen);
resetToDefaults_[attrEnum] = pCurrVal;
}
char *newVal = NULL;
Lng32 newValLen = str_len(value) + 1;
if (provenances_[attrEnum] > INIT_DEFAULT_DEFAULTS) {
Lng32 oldValLen = str_len(currentDefaults_[attrEnum]) + 1;
if (oldValLen >= newValLen && oldValLen < newValLen + 100)
newVal = const_cast<char*>(currentDefaults_[attrEnum]); // reuse, to reduce mem frag
else
NADELETEBASIC(currentDefaults_[attrEnum], NADHEAP);
}
if (!newVal) newVal = new NADHEAP char[newValLen];
str_cpy_all(newVal, value, newValLen);
currentDefaults_[attrEnum] = newVal;
// when the parser flag is on for a set-once CQD
// set its provenance as INIT_DEFAULT_DEFAULTS,
// so the user can set it once later
if ( isSetOnceAttribute(attrEnum) &&
Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL) )
{
provenances_[attrEnum] = INIT_DEFAULT_DEFAULTS;
}
else
{
provenances_[attrEnum] = currentState_;
}
return TRUE;
}
NADefaults::Provenance NADefaults::getProvenance(Int32 attrEnum) const
{
ATTR_RANGE_ASSERT;
return (Provenance)provenances_[attrEnum];
}
NABoolean NADefaults::getValue(Int32 attrEnum, NAString &result) const
{
ATTR_RANGE_ASSERT;
result = currentDefaults_[attrEnum];
return TRUE; // we always have a STRING REPRESENTATION value
}
NAString NADefaults::getString(Int32 attrEnum) const
{
ATTR_RANGE_ASSERT;
return currentDefaults_[attrEnum];
}
const char * NADefaults::getValue(Int32 attrEnum) const
{
ATTR_RANGE_ASSERT;
return currentDefaults_[attrEnum];
}
NABoolean NADefaults::getFloat(Int32 attrEnum, float &result) const
{
ATTR_RANGE_ASSERT;
if (currentFloats_[attrEnum]) {
result = *currentFloats_[attrEnum];
}
else if (validateFloat(currentDefaults_[attrEnum], result, attrEnum)) {
currentFloats_[attrEnum] = new NADHEAP float; // cache the result
*currentFloats_[attrEnum] = result;
}
else {
return FALSE; // result is neg, from failed validateFloat()
}
return TRUE;
}
double NADefaults::getAsDouble(Int32 attrEnum) const
{
// No domainMatch() needed: any float or double (or int or uint) is okay;
// getFloat()/validateFloat() will disallow any non-numerics.
float flt;
getFloat(attrEnum, flt);
return double(flt);
}
Lng32 NADefaults::getAsLong(Int32 attrEnum) const
{
float flt;
getFloat(attrEnum, flt);
if (!domainMatch(attrEnum, VALID_INT, &flt)) { CMPBREAK; }
return Lng32(flt);
}
ULng32 NADefaults::getAsULong(Int32 attrEnum) const
{
float flt;
getFloat(attrEnum, flt);
if (!domainMatch(attrEnum, VALID_UINT, &flt)) { CMPBREAK; }
return (ULng32)(flt);
}
ULng32 NADefaults::getNumOfESPsPerNode() const
{
return (ULng32)MAXOF(ceil(getNumOfESPsPerNodeInFloat()), 1);
}
float NADefaults::getNumOfESPsPerNodeInFloat() const
{
double maxEspPerCpuPerOp = getAsDouble(MAX_ESPS_PER_CPU_PER_OP);
CollIndex cores =
( (CmpCommon::context() && CURRSTMT_OPTDEFAULTS->isFakeHardware())
) ?
getAsLong(DEF_NUM_SMP_CPUS) :
gpClusterInfo->numberOfCpusPerSMP();
return float(maxEspPerCpuPerOp * cores);
}
ULng32 NADefaults::getTotalNumOfESPsInCluster(NABoolean& fakeEnv) const
{
fakeEnv = FALSE;
if (getToken(PARALLEL_NUM_ESPS, 0) != DF_SYSTEM ) {
fakeEnv = TRUE;
return getAsLong(PARALLEL_NUM_ESPS);
}
float espsPerNode = getNumOfESPsPerNodeInFloat();
CollIndex numOfNodes = gpClusterInfo->numOfSMPs();
if ( (CmpCommon::context() && CURRSTMT_OPTDEFAULTS->isFakeHardware())) {
fakeEnv = TRUE;
numOfNodes = getAsLong(DEF_NUM_NODES_IN_ACTIVE_CLUSTERS);
}
return MAXOF(ceil(espsPerNode * numOfNodes), 1);
}
NABoolean NADefaults::domainMatch(Int32 attrEnum,
Int32 expectedType/*DefaultValidatorType*/,
float *flt) const
{
if (validator(attrEnum)->getType() == expectedType)
return TRUE; // yes, domains match
// Emit error messages only if the value is actually out-of-range.
//
// Users (optimizer code) should REALLY be using 'unsigned long' fields
// and calling getAsULong, instead of using 'long' fields to retrieve
// unsigned(DDui*) attr values via getAsLong ...
//
// if we get here the compiler will crash
if (flt) {
DefaultValidator *validator = NULL;
if (expectedType == VALID_INT) validator = (DefaultValidator *)&validateInt;
else if (expectedType == VALID_UINT) validator = (DefaultValidator *)&validateUI;
// Explicitly check for TRUE here --
// both FALSE/error and SilentIfSYSTEM are out-of-range/out-of-domain
// from this method's point of view.
if (validator)
if (validator->validate(
currentDefaults_[attrEnum], this, attrEnum, -1, flt) == TRUE)
return TRUE; // domain mismatch, but value *is* in the domain range
} // fall thru to emit additional failure info
*CmpCommon::diags() << DgSqlCode(+2058) // emit a mismatch WARNING
<< DgString0(lookupAttrName(attrEnum))
<< DgString1(validator(attrEnum)->getTypeText())
<< DgString2(DefaultValidator::getTypeText(
DefaultValidatorType(expectedType)));
#ifndef NDEBUG
cerr << "Warning[2058] " << lookupAttrName(attrEnum)
<< " " << validator(attrEnum)->getTypeText()
<< " " << DefaultValidator::getTypeText(
DefaultValidatorType(expectedType))
<< " " << (flt ? *flt : 123.45) << endl;
#endif
return FALSE;
}
// CONTROL QUERY DEFAULT attr RESET;
// resets the single attr to the value it had right after we read all
// the DEFAULTS tables,
// or the value it had right before a CQD * RESET RESET.
// CONTROL QUERY DEFAULT * RESET;
// resets all attrs to the values they had by same criteria as above.
// CONTROL QUERY DEFAULT * RESET RESET;
// resets the "reset-to" values so that all current values become the
// effective "reset-to"'s -- i.e, the current values can't be lost
// on the next CQD * RESET;
// Useful for apps that dynamically send startup settings that ought
// to be preserved -- ODBC and SQLCI do this.
//
void NADefaults::resetAll(NAString &value, short reset, Int32 errOrWarn)
{
size_t i, numAttrs = numDefaultAttributes();
if (reset == 1) { // CQD * RESET; (not RESET RESET)
setResetAll(TRUE);
for (int i = 0 ; i < numAttrs; i++ ) {
if (provenances_[i] == SET_BY_CQD || provenances_[i] == DERIVED || provenances_[i] == COMPUTED)
{
//delete the current cqd value
if (resetToDefaults_[i]) {
NADELETEBASIC(resetToDefaults_[i], NADHEAP);
resetToDefaults_[i] = NULL;
}
if (currentDefaults_[i]) {
NADELETEBASIC(currentDefaults_[i], NADHEAP);
currentDefaults_[i] = NULL;
}
if (currentTokens_[i]) {
NADELETEBASIC(currentTokens_[i], NADHEAP);
currentTokens_[i] = NULL;
}
if (currentFloats_[i]) {
NADELETEBASIC(currentFloats_[i], NADHEAP);
currentFloats_[i] = NULL;
}
// Copy from saved defaults;
provenances_[i] = provenancesWithCQDsFromDefaultsTable_[i];
if (provenances_[i] == INIT_DEFAULT_DEFAULTS) {
currentDefaults_[i] = defaultsWithCQDsFromDefaultsTable_[i];
currentTokens_[i] = tokensWithCQDsFromDefaultsTable_[i];
currentFloats_[i] = floatsWithCQDsFromDefaultsTable_[i];
}
else {
currentDefaults_[i] = new NADHEAP char[strlen(defaultsWithCQDsFromDefaultsTable_[i]) + 1];
strcpy((char *)currentDefaults_[i], defaultsWithCQDsFromDefaultsTable_[i]);
if (tokensWithCQDsFromDefaultsTable_[i] != NULL) {
currentTokens_[i] = new NADHEAP DefaultToken;
*currentTokens_[i] = *tokensWithCQDsFromDefaultsTable_[i];
}
if (floatsWithCQDsFromDefaultsTable_[i] != NULL) {
currentFloats_[i] = new NADHEAP float;
*currentFloats_[i] = *floatsWithCQDsFromDefaultsTable_[i];
}
}
}
}
// if DEFAULT_SCHEMA_NAMETYPE=USER after CQD * RESET
// set SCHEMA to LDAP_USERNAME
// if SCHEMA has not been specified by user
if ( (getToken(DEFAULT_SCHEMA_NAMETYPE) == DF_USER) &&
schSetByNametype() )
{
setSchemaAsLdapUser();
}
setResetAll(FALSE);
}
else if (reset == 2) {
for (i = 0; i < numAttrs; i++) {
if (resetToDefaults_[i]) {
NADELETEBASIC(resetToDefaults_[i], NADHEAP);
resetToDefaults_[i] = NULL;
}
if (provenances_[i] == SET_BY_CQD || provenances_[i] == DERIVED || provenances_[i] == COMPUTED)
provenances_[i] = CQD_RESET_RESET;
}
}
else {
CMPASSERT(reset == 0);
}
}
NABoolean NADefaults::isReadonlyAttribute(const char* attrName) const
{
if ((( stricmp(attrName, "ISO_MAPPING") == 0 ) ||
( stricmp(attrName, "OVERFLOW_MODE") == 0 ) ||
( stricmp(attrName, "SORT_ALGO") == 0 ))
&& ( CmpCommon::getDefault(DISABLE_READ_ONLY) == DF_ON ))
return FALSE; // for internal development and testing purposes
if (( stricmp(attrName, "ISO_MAPPING") == 0 )||
( stricmp(attrName, "NATIONAL_CHARSET") == 0 ) ||
( stricmp(attrName, "VALIDATE_VIEWS_AT_OPEN_TIME") == 0 ) ||
( stricmp(attrName, "USER_EXPERIENCE_LEVEL") == 0 ) ||
( stricmp(attrName, "POS_DISKS_IN_SEGMENT") == 0 ) ||
( stricmp(attrName, "BMO_MEMORY_LIMIT_LOWER_BOUND_HASHJOIN") == 0 ) ||
( stricmp(attrName, "EXE_MEMORY_LIMIT_LOWER_BOUND_MERGEJOIN") == 0 ) ||
( stricmp(attrName, "BMO_MEMORY_LIMIT_LOWER_BOUND_HASHGROUPBY") == 0 ) ||
( stricmp(attrName, "BMO_MEMORY_LIMIT_LOWER_BOUND_SORT") == 0 ) ||
( stricmp(attrName, "EXE_MEMORY_LIMIT_LOWER_BOUND_SEQUENCE") == 0 ) ||
( stricmp(attrName, "EXE_MEMORY_LIMIT_LOWER_BOUND_EXCHANGE") == 0 ) ||
( stricmp(attrName, "SORT_ALGO") == 0 ) ||
( stricmp(attrName, "OVERFLOW_MODE") == 0 )
)
return TRUE;
if (strlen(attrName) > 0)
{
DefaultConstants v = lookupAttrName(attrName, 0, 0);
if ((v != __INVALID_DEFAULT_ATTRIBUTE) &&
(getFlags(v) & DEFAULT_IS_SSD))
return TRUE;
}
return FALSE;
}
// these defaults cannot be reset or set to FALSE through a cqd.
NABoolean NADefaults::isNonResetableAttribute(const char* attrName) const
{
if (( stricmp(attrName, "IS_SQLCI") == 0 ) ||
( stricmp(attrName, "NVCI_PROCESS") == 0 ) ||
( stricmp(attrName, "SESSION_ID") == 0 ) ||
( stricmp(attrName, "LDAP_USERNAME") == 0 ) ||
( stricmp(attrName, "VOLATILE_SCHEMA_IN_USE") == 0 ) ||
( stricmp(attrName, "SESSION_USERNAME") == 0 ) )
return TRUE;
return FALSE;
}
// these defaults can be set only once by user.
NABoolean NADefaults::isSetOnceAttribute(Int32 attrEnum) const
{
if ( attrEnum == DEFAULT_SCHEMA_ACCESS_ONLY )
return TRUE;
return FALSE;
}
void NADefaults::resetSessionOnlyDefaults()
{
NAString value;
validateAndInsert("NVCI_PROCESS", value, 3, 0);
}
// Parameter <reset> must not be a reference (&);
// see <value = ... fall thru> below.
enum DefaultConstants NADefaults::validateAndInsert(const char *attrName,
NAString &value,
NABoolean reset,
Int32 errOrWarn,
Provenance overwriteIfNotYet)
{
NABoolean overwrite = FALSE;
NABoolean isJDBC = FALSE;
NABoolean isODBC = FALSE;
if (ActiveSchemaDB())
{
isJDBC = (CmpCommon::getDefault(JDBC_PROCESS) == DF_ON ? TRUE : FALSE);
isODBC = (CmpCommon::getDefault(ODBC_PROCESS) == DF_ON ? TRUE : FALSE);
}
if (reset && !attrName[0]) { // CONTROL QUERY DEFAULT * RESET
overwrite = currentState_ < overwriteIfNotYet;
if (overwrite) resetAll(value, reset, errOrWarn);
return (DefaultConstants)0; // success
}
// Perform a lookup for the string, using a binary search.
DefaultConstants attrEnum = lookupAttrName(attrName, errOrWarn);
if (attrEnum >= 0) { // valid attrName
// ignore DEFAULT_SCHEMA_ACCESS_ONLY if it is in system defaults
if ( attrEnum == DEFAULT_SCHEMA_ACCESS_ONLY &&
getState() < SET_BY_CQD )
return attrEnum;
// do the following check when
// this is the primary mxcmp
// and INTERNAL_QUERY_FROM_EXEUTIL is not set
if (!CmpCommon::context()->isSecondaryMxcmp() &&
!Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
{
// This logic will catch if the set-once CQD
// is set, but the ALLOW_SET_ONCE_DEFAULTS parserflags
// are not set. This is absolutely necessary for security
// to ensure that the correct parserflags are set.
if ((isSetOnceAttribute(attrEnum)) &&
(!isResetAll()) && // no error msg for cqd * reset
(NOT Get_SqlParser_Flags(ALLOW_SET_ONCE_DEFAULTS)))
{
*CmpCommon::diags() << DgSqlCode(-30042) << DgString0(attrName);
return attrEnum;
}
// if DEFAULT_SCHEMA_ACCESS_ONLY is on,
// users cannot change the following CQDs
if ( getState() >= SET_BY_CQD &&
getToken(DEFAULT_SCHEMA_ACCESS_ONLY) == DF_ON )
{
if (attrEnum == SCHEMA ||
attrEnum == PUBLIC_SCHEMA_NAME ||
attrEnum == DEFAULT_SCHEMA_NAMETYPE)
{
if (!isResetAll()) // no error msg for cqd * reset
*CmpCommon::diags() << DgSqlCode(-30043) << DgString0(attrName);
return attrEnum;
}
}
}
else
{
// ignore LAST0_MODE cqd if we are in secondary mxcmp or if
// internal_query_from_exeutil is set. This cqd is not meant
// to apply in these cases
if ( attrEnum == LAST0_MODE )
return attrEnum;
}
overwrite = getProvenance(attrEnum) < overwriteIfNotYet;
// Put value into canonical form (trimmed, upcased where pertinent).
//
// Possibly revert to initial default default value -- see NOTE 3 up above.
// Note further that ANSI names cannot revert on values of
// 'SYSTEM' or 'ENABLE', as those are legal cat/sch/tbl names,
// nor can they revert on '' (empty/blank), as ANSI requires us to
// emit a syntax error for this.
//
// Possibly RESET to read-from-table value (before any CQD value).
//
TrimNAStringSpace(value);
if (validator(attrEnum) != &validateAnsiName && !reset) {
validator(attrEnum)->applyUpper(value);
if (isSynonymOfSYSTEM(attrEnum, value))
value = getDefaultDefaultValue(attrEnum);
else if (isSynonymOfRESET(value)) // CQD attr 'RESET'; ...
reset = 1;
}
if (reset) { // CQD attr RESET;
if ((isNonResetableAttribute(attrName)) &&
(reset != 3))
return attrEnum;
if (!resetToDefaults_[attrEnum]) {
if (overwrite)
value = currentDefaults_[attrEnum]; // return actual val to caller
if (attrEnum == ISOLATION_LEVEL)
{
// reset this in the global area
TransMode::IsolationLevel il;
getIsolationLevel(il);
CmpCommon::transMode()->updateAccessModeFromIsolationLevel(il);
}
// Solution: 10-060418-5903. Do not update MXCMP global access mode
// with CQD ISOLATION_LEVEL_FOR_UPDATES as it will overwrite that
// set by ISOLATION_LEVE. The CQD ISOLATION_LEVEL_FOR_UPDATES is
// always accessed directly when necessary.
//else if (attrEnum == ISOLATION_LEVEL_FOR_UPDATES)
// {
// // reset this in the global area
// TransMode::IsolationLevel il;
// getIsolationLevel(il, getToken(attrEnum));
// CmpCommon::transMode()->updateAccessModeFromIsolationLevel(il,
// FALSE);
// }
return attrEnum;
}
value = resetToDefaults_[attrEnum]; // fall thru, REINSERT this val
}
if (attrEnum == CATALOG) {
if (!setCatalog(value, errOrWarn, overwrite))
attrEnum = __INVALID_DEFAULT_ATTRIBUTE;
else
{
if (getState() == READ_FROM_SQL_TABLE)
{
// set the volatile catalog to be same as the catalog read from
// defaults table. If there is no catalog or volatile_catalog
// specified in the defaults table, then volatile catalog name
// will be the default catalog in use in the session where
// volatile tables are created.
CmpCommon::context()->sqlSession()->setVolatileCatalogName(value);
}
}
}
else if (attrEnum == SCHEMA) {
if (!setSchema(value, errOrWarn, overwrite))
attrEnum = __INVALID_DEFAULT_ATTRIBUTE;
else
{
if (getState() == READ_FROM_SQL_TABLE)
{
// set the volatile catalog to be same as the catalog read from
// defaults table. If there is no catalog or volatile_catalog
// specified in the defaults table, then volatile catalog name
// will be the default catalog in use in the session where
// volatile tables are created.
NAString cat(getValue(CATALOG));
CmpCommon::context()->sqlSession()->setVolatileCatalogName(cat);
}
}
}
else {
if ( attrEnum == MAX_LONG_VARCHAR_DEFAULT_SIZE ||
attrEnum == MAX_LONG_WVARCHAR_DEFAULT_SIZE ) {
ULng32 minLength;
switch (attrEnum) {
case MAX_LONG_VARCHAR_DEFAULT_SIZE:
minLength = (Lng32)getAsULong(MIN_LONG_VARCHAR_DEFAULT_SIZE);
break;
case MAX_LONG_WVARCHAR_DEFAULT_SIZE:
minLength = (Lng32)getAsULong(MIN_LONG_WVARCHAR_DEFAULT_SIZE);
break;
default:
attrEnum = __INVALID_DEFAULT_ATTRIBUTE;
}
if ( attrEnum != __INVALID_DEFAULT_ATTRIBUTE ) {
UInt32 newMaxLength;
Int32 n = -1;
sscanf(value.data(), "%u%n", &newMaxLength, &n);
if ( n>0 && (UInt32)n == value.length() ) { // a valid unsigned number
if ( newMaxLength < minLength )
{
*CmpCommon::diags() << DgSqlCode(-2030) << DgInt0((Lng32)minLength);
attrEnum = __INVALID_DEFAULT_ATTRIBUTE;
}
}
}
}
if ( attrEnum == MIN_LONG_VARCHAR_DEFAULT_SIZE ||
attrEnum == MIN_LONG_WVARCHAR_DEFAULT_SIZE ) {
ULng32 maxLength;
switch (attrEnum) {
case MIN_LONG_VARCHAR_DEFAULT_SIZE:
maxLength = getAsULong(MAX_LONG_VARCHAR_DEFAULT_SIZE);
break;
case MIN_LONG_WVARCHAR_DEFAULT_SIZE:
maxLength = getAsULong(MAX_LONG_WVARCHAR_DEFAULT_SIZE);
break;
default:
attrEnum = __INVALID_DEFAULT_ATTRIBUTE;
}
if ( attrEnum != __INVALID_DEFAULT_ATTRIBUTE ) {
UInt32 newMinLength;
Int32 n = -1;
sscanf(value.data(), "%u%n", &newMinLength, &n);
if ( n>0 && (UInt32)n == value.length() ) { // a valid unsigned number
if ( newMinLength > maxLength )
{
*CmpCommon::diags() << DgSqlCode(-2029) << DgInt0((Lng32)maxLength);
attrEnum = __INVALID_DEFAULT_ATTRIBUTE;
}
}
}
}
if (errOrWarn && (attrEnum == ROUNDING_MODE))
{
if (NOT ((value.length() == 1) &&
((*value.data() == '0') ||
(*value.data() == '1') ||
(*value.data() == '2'))))
{
*CmpCommon::diags() << DgSqlCode(-2055)
<< DgString0(value)
<< DgString1(lookupAttrName(attrEnum));
attrEnum = __INVALID_DEFAULT_ATTRIBUTE;
}
}
if ( attrEnum == SCRATCH_MAX_OPENS_HASH ||
attrEnum == SCRATCH_MAX_OPENS_SORT )
{
if (NOT ((value.length() == 1) &&
((*value.data() == '1') ||
(*value.data() == '2') ||
(*value.data() == '3') ||
(*value.data() == '4'))))
{
*CmpCommon::diags() << DgSqlCode(-2055)
<< DgString0(value)
<< DgString1(lookupAttrName(attrEnum));
attrEnum = __INVALID_DEFAULT_ATTRIBUTE;
}
}
if (attrEnum != __INVALID_DEFAULT_ATTRIBUTE)
{
// We know that the MP_COLLATIONS validator emits only warnings
// and always returns TRUE. On the validate-but-do-not-insert step
// (CQD compilation), those warnings will be seen by the user.
// On the validate-AND-insert (CQD execution), there is no need
// to repeat them (besides, that causes Executor to choke on the
// warnings in the diags and say 'Error fetching from TCB tree').
Int32 isValid = TRUE;
if (!overwrite || currentState_ < SET_BY_CQD ||
validator(attrEnum) != &validateCollList)
isValid = validator(attrEnum)->validate(value, this, attrEnum, errOrWarn);
// if an internal reset is being done, then make it a valid attr
// even if the 'validate' method above returned invalid.
if ((!isValid) &&
(isNonResetableAttribute(attrName)) &&
(reset == 3))
{
isValid = TRUE;
}
if (!isValid)
attrEnum = __INVALID_DEFAULT_ATTRIBUTE;
else if (overwrite) {
if (isValid == SilentIfSYSTEM) { // defDef value was "SYSTEM" or ""
// Undo any caching from getFloat()
NADELETEBASIC(currentFloats_[attrEnum], NADHEAP);
currentFloats_[attrEnum] = NULL;
// Undo any caching from getToken()
if (provenances_[attrEnum] > INIT_DEFAULT_DEFAULTS)
NADELETEBASIC( currentTokens_[attrEnum], NADHEAP );
currentTokens_[attrEnum] = NULL;
// Now fall thru to insert the string "SYSTEM" or ""
}
if (!insert(attrEnum, value, errOrWarn))
attrEnum = __INVALID_DEFAULT_ATTRIBUTE;
} // overwrite (i.e. insert)
}
} // not special val/ins for CAT, SCH, or MPLOC
} // valid attrName
if (attrEnum >= 0) {
if (overwrite) {
if ((! reset) &&
(currentState_ == SET_BY_CQD))
{
// indicate that this attribute was set by a user CQD.
setUserDefault(attrEnum, TRUE);
}
switch (attrEnum) {
case CATALOG:
case SCHEMA:
break;
case ISOLATION_LEVEL:
{
// Ansi 14.1 SR 4. See comexe/ExControlArea::addControl().
//## I now think this implementation is wrong
//## because this is setting GLOBAL state
//## for something that should be CONTEXT-dependent.
//## Will cause us headaches later, when we
//## make arkcmp be a multi-context multi-threaded server.
TransMode::IsolationLevel il;
getIsolationLevel(il);
CmpCommon::transMode()->updateAccessModeFromIsolationLevel(il);
}
break;
// Solution: 10-060418-5903. Do not update MXCMP global access mode
// with CQD ISOLATION_LEVEL_FOR_UPDATES as it will overwrite that
// set by ISOLATION_LEVEL. The CQD ISOLATION_LEVEL_FOR_UPDATES is
// always accessed directly when necessary.
//case ISOLATION_LEVEL_FOR_UPDATES:
//{
// TransMode::IsolationLevel il;
// getIsolationLevel(il, getToken(attrEnum));
// CmpCommon::transMode()->updateAccessModeFromIsolationLevel(il,
// FALSE);
//}
//break;
case ALLOW_INCOMPATIBLE_ASSIGNMENT:
case ALLOW_INCOMPATIBLE_COMPARISON:
{
NAString val;
if (value == "ON")
val = "ON";
else
val = "OFF";
insert(ALLOW_INCOMPATIBLE_OPERATIONS, val, errOrWarn);
}
break;
case MODE_SPECIAL_1:
{
NAString val;
if (value == "ON")
val = "ON";
else
val = "OFF";
insert(ALLOW_INCOMPATIBLE_OPERATIONS, val, errOrWarn);
// find_suitable_key to be turned off in this mode, unless
// it has been explicitely set.
if (getToken(VOLATILE_TABLE_FIND_SUITABLE_KEY) == DF_SYSTEM)
{
insert(VOLATILE_TABLE_FIND_SUITABLE_KEY, "OFF", errOrWarn);
}
}
break;
case MODE_SPECIAL_4:
{
NAString val;
if (value == "ON")
val = "ON";
else
val = "OFF";
insert(ALLOW_INCOMPATIBLE_OPERATIONS, val, errOrWarn);
NAString csVal;
if (value == "ON")
csVal = SQLCHARSETSTRING_UTF8;
else
csVal = "";
validateAndInsert("TRAF_DEFAULT_COL_CHARSET", csVal, FALSE, errOrWarn);
NAString notVal;
if (value == "ON")
notVal = "OFF";
else
notVal = "ON";
insert(TRAF_COL_LENGTH_IS_CHAR, notVal, errOrWarn);
NAString costVal1;
NAString costVal2;
if (value == "ON") {
costVal1 = "8.0";
costVal2 = "16.0" ;
}
else {
costVal1 = "1.0";
costVal2 = "1.0" ;
}
validateAndInsert("NCM_IND_JOIN_COST_ADJ_FACTOR", costVal1,
FALSE, errOrWarn);
validateAndInsert("NCM_IND_SCAN_COST_ADJ_FACTOR", costVal2,
FALSE, errOrWarn);
if (value == "ON")
Set_SqlParser_Flags(IN_MODE_SPECIAL_4);
else
Reset_SqlParser_Flags(IN_MODE_SPECIAL_4);
}
break;
insert(UPD_SAVEPOINT_ON_ERROR, "OFF", errOrWarn);
insert(UPD_SAVEPOINT_ON_ERROR, "ON", errOrWarn);
case MEMORY_LIMIT_QCACHE_UPPER_KB:
CURRENTQCACHE->setHeapUpperLimit((size_t) 1024 * atoi(value.data()));
break;
case MEMORY_LIMIT_HISTCACHE_UPPER_KB:
CURRCONTEXT_HISTCACHE->setHeapUpperLimit((size_t) 1024 * atoi(value.data()));
break;
case MEMORY_LIMIT_CMPSTMT_UPPER_KB:
STMTHEAP->setUpperLimit((size_t) 1024 * atoi(value.data()));
break;
case MEMORY_LIMIT_CMPCTXT_UPPER_KB:
CTXTHEAP->setUpperLimit((size_t) 1024 * atoi(value.data()));
break;
case MEMORY_LIMIT_NATABLECACHE_UPPER_KB:
ActiveSchemaDB()->getNATableDB()->setHeapUpperLimit((size_t) 1024 * atoi(value.data()));
break;
case NAMETYPE:
SqlParser_NADefaults_->NAMETYPE_ = token(NAMETYPE, value, TRUE);
break;
case NATIONAL_CHARSET:
SqlParser_NADefaults_->NATIONAL_CHARSET_ = CharInfo::getCharSetEnum(value);
break;
case SESSION_ID:
{
CmpCommon::context()->sqlSession()->setSessionId(value);
}
break;
case SESSION_USERNAME:
{
CmpCommon::context()->sqlSession()->setSessionUsername(value);
}
break;
case SESSION_IN_USE:
{
CmpCommon::context()->sqlSession()->setSessionInUse
((getToken(attrEnum) == DF_ON));
}
break;
case SQLMX_REGRESS:
{
if (value == "ON")
{
insert(SHOWDDL_DISPLAY_FORMAT, "INTERNAL", errOrWarn);
insert(MODE_SPECIAL_1, "OFF", errOrWarn);
if (getToken(VOLATILE_TABLE_FIND_SUITABLE_KEY) == DF_SYSTEM)
{
insert(VOLATILE_TABLE_FIND_SUITABLE_KEY, "OFF", errOrWarn);
}
char * env = getenv("SQLMX_REGRESS");
if (env)
CmpCommon::context()->setSqlmxRegress(atoi(env));
else
CmpCommon::context()->setSqlmxRegress(1);
}
else
{
insert(SHOWDDL_DISPLAY_FORMAT, "EXTERNAL", errOrWarn);
CmpCommon::context()->setSqlmxRegress(0);
}
}
break;
case VOLATILE_CATALOG:
{
CmpCommon::context()->sqlSession()->setVolatileCatalogName(value);
}
break;
case VOLATILE_SCHEMA_IN_USE:
{
CmpCommon::context()->sqlSession()->setVolatileSchemaInUse
((getToken(attrEnum) == DF_ON));
}
break;
case ISO_MAPPING:
{
SqlParser_NADefaults_->ISO_MAPPING_ = CharInfo::getCharSetEnum(value);
// Set the NAString_isoMappingCS memory cache for use by routines
// ToInternalIdentifier() and ToAnsiIdentifier[2|3]() in module
// w:/common/NAString[2].cpp. These routines currently cannot
// access SqlParser_ISO_MAPPING directly due to the complex
// build hierarchy.
NAString_setIsoMapCS((SQLCHARSET_CODE) SqlParser_NADefaults_->ISO_MAPPING_);
}
break;
case DEFAULT_CHARSET:
{
SqlParser_NADefaults_->DEFAULT_CHARSET_ = CharInfo::getCharSetEnum(value);
SqlParser_NADefaults_->ORIG_DEFAULT_CHARSET_ = CharInfo::getCharSetEnum(value);
}
break;
case QUERY_TEXT_CACHE:
{
// If public schema is in use, query text cache has to be off
NAString pSchema = getValue(PUBLIC_SCHEMA_NAME);
if (pSchema != "")
value = "OFF";
}
break;
case PUBLIC_SCHEMA_NAME:
{
// when PUBLIC_SCHEMA is used, turn off Query Text Cache
if ( (value != "") && !(getToken(QUERY_TEXT_CACHE) == DF_OFF) )
insert(QUERY_TEXT_CACHE, "OFF");
// when PUBLIC_SCHEMA is not used, reset to the default value
if ( value == "" )
{
NAString v("");
validateAndInsert("QUERY_TEXT_CACHE", v, TRUE);
}
}
break;
case LDAP_USERNAME:
{
// when the LDAP_USERNAME is set (first time by CLI)
// if DEFAULT_SCHEMA_NAMETYPE is USER, set schema to LDAP_USERNAME
if ( !value.isNull() &&
(getToken(DEFAULT_SCHEMA_NAMETYPE) == DF_USER) &&
!userDefault(SCHEMA) && // do not change user setting
( schSetToUserID() || // only when schema was initialized to guardian id
schSetByNametype() ) ) // or changed by same CQD
{
setSchemaAsLdapUser(value);
setSchByNametype(TRUE);
}
}
break;
case DEFAULT_SCHEMA_ACCESS_ONLY:
{
if ( value == "ON" )
{
NAString schemaNameType = getValue(DEFAULT_SCHEMA_NAMETYPE);
if ( schemaNameType == "USER" )
{
setSchemaAsLdapUser();
}
}
}
break;
case DEFAULT_SCHEMA_NAMETYPE:
{
if ( userDefault(SCHEMA) ) // if SCHEMA has been changed by user, do nothing
break;
if ( value == "SYSTEM" )
// reset to default schema
{
if ( schSetByNametype() ) // only when schema was changed by this CQD
{
// do not change catSchSetToUserID_ flag
Int32 preVal = catSchSetToUserID_;
NAString v("");
validateAndInsert("SCHEMA", v, TRUE);
catSchSetToUserID_ = preVal;
}
}
if ( value == "USER" )
// set default schema to ldpa username
{
if ( schSetToUserID() || // only when schema was initialized to guardian id
schSetByNametype() ) // or was changed by this CQD
{
setSchemaAsLdapUser();
setSchByNametype(TRUE);
}
}
}
break;
case USTAT_IUS_PERSISTENT_CBF_PATH:
{
// if the CBF path is SYSTEM, set it to $HOME/cbfs
if ( value == "SYSTEM" ) {
const char* home = getenv("HOME");
if ( home ) {
value = home;
value += "/cbfs";
validateAndInsert("USTAT_IUS_PERSISTENT_CBF_PATH", value, FALSE);
}
}
}
break;
case TRAF_LOAD_ERROR_LOGGING_LOCATION:
{
if (value.length() > 512)
{
*CmpCommon::diags() << DgSqlCode(-2055)
<< DgString0(value)
<< DgString1(lookupAttrName(attrEnum));
}
}
break;
case AGGRESSIVE_ESP_ALLOCATION_PER_CORE:
{
NABoolean useAgg = (getToken(attrEnum) == DF_ON);
float numESPsPerCore = computeNumESPsPerCore(useAgg);
char valuestr[WIDEST_CPUARCH_VALUE];
ftoa_(numESPsPerCore, valuestr);
NAString val(valuestr);
insert(MAX_ESPS_PER_CPU_PER_OP, val, errOrWarn);
}
break;
// max char col length is defined in common/ComSmallDefs.h.
// In special cases, it could be overridden. Internal use only or
// use only under trafodion supervision.
case TRAF_MAX_CHARACTER_COL_LENGTH:
{
NABoolean override = (getToken(TRAF_MAX_CHARACTER_COL_LENGTH_OVERRIDE) == DF_ON);
double d = atof(value.data());
if ((NOT override) &&
(NOT (d >= 0 && d <= MAX_CHAR_COL_LENGTH_IN_BYTES)))
{
*CmpCommon::diags() << DgSqlCode(-2055)
<< DgString0(value)
<< DgString1(lookupAttrName(attrEnum));
}
}
break;
case TRAF_MAX_CHARACTER_COL_LENGTH_OVERRIDE:
{
// if override is being turned off, reset max_char_len to default value.
if (value == "OFF")
{
NAString val;
validateAndInsert("TRAF_MAX_CHARACTER_COL_LENGTH", val, TRUE);
}
}
break;
case LOB_GC_LIMIT_SIZE:
if ((atoi(value.data()) < -1) || (((atoi(value.data()) >0) && (atoi(value.data())) <= 512)))
{
*CmpCommon::diags() << DgSqlCode(-2055)
<< DgString0(value)
<< DgString1(lookupAttrName(attrEnum));
}
break;
case LOB_MAX_CHUNK_MEM_SIZE:
if (atoi(value.data()) < 0 || atoi(value.data()) > 5120)
{
*CmpCommon::diags() << DgSqlCode(-2055)
<< DgString0(value)
<< DgString1(lookupAttrName(attrEnum));
}
break;
case LOB_INPUT_LIMIT_FOR_BATCH:
if (atoi(value.data()) <0 && (atoi(value.data())*1024) > INT_MAX )
{
*CmpCommon::diags() << DgSqlCode(-2055)
<< DgString0(value)
<< DgString1(lookupAttrName(attrEnum));
}
break;
default:
break;
}
} // code to valid overwrite (insert)
if (reset && overwrite) {
// CONTROL QUERY DEFAULT attr RESET; -- this code cloned above
// Can't reset prov, because to which?
// provenances_[attrEnum] = READ_FROM_SQL_TABLE or COMPUTED ??
NADELETEBASIC(resetToDefaults_[attrEnum], NADHEAP);
resetToDefaults_[attrEnum] = NULL;
}
else if (!overwrite && errOrWarn && getProvenance(attrEnum) >= IMMUTABLE) {
*CmpCommon::diags() << DgSqlCode(ERRWARN(2200))
<< DgString0(lookupAttrName(attrEnum, errOrWarn));
}
} // valid attrName
return attrEnum;
} // NADefaults::validateAndInsert()
float NADefaults::computeNumESPsPerCore(NABoolean aggressive)
{
#define DEFAULT_ESPS_PER_NODE 2 // for conservation allocation
#define DEFAULT_ESPS_PER_CORE 0.5 // for aggressive allocation
// Make sure the gpClusterInfo points at an NAClusterLinux object.
// In osim simulation mode, the pointer can point at a NAClusterNSK
// object, for which the method numTSEsForPOS() is not defined.
NAClusterInfoLinux* gpLinux = dynamic_cast<NAClusterInfoLinux*>(gpClusterInfo);
assert(gpLinux);
// cores per node
Lng32 coresPerNode = gpClusterInfo->numberOfCpusPerSMP();
if ( aggressive ) {
float totalMemory = gpLinux->totalMemoryAvailable(); // per Node, in KB
totalMemory /= (1024*1024); // per Node, in GB
totalMemory /= coresPerNode ; // per core, in GB
totalMemory /= 2; // per core, 2GB per ESP
return MINOF(DEFAULT_ESPS_PER_CORE, totalMemory);
} else {
Lng32 numESPsPerNode = DEFAULT_ESPS_PER_NODE;
return (float)(numESPsPerNode)/(float)(coresPerNode);
}
// The following lines of code are comment out but retained for possible
// future references.
//
// // number of POS TSE
// Lng32 numTSEsPerCluster = gpLinux->numTSEsForPOS();
//
// // cluster nodes
// Lng32 nodesdPerCluster = gpClusterInfo->getTotalNumberOfCPUs();
//
// // TSEs per node
// Lng32 TSEsPerNode = numTSEsPerCluster/nodesdPerCluster;
//
//
//
// // For Linux/nt, we conservatively allocate ESPs per node as follows
// // - 1 ESP per 2 cpu cores if cores are equal or less than TSEs
// // - 1 ESP per TSE if number of cores is more than double the TSEs
// // - 1 ESP per 2 TSEs if cores are more than TSEs but less than double the TSEs
// // - 1 ESP per node. Only possible on NT or workstations
// // - number of cores less than TSEs and there are 1 or 2 cpur cores per node
// // - number of TSEs is less than cpu cores and there 1 or 2 TSEs per node.
// // This case is probable if virtual nodes are used
//
// // TSEsPerNode is 0 for arkcmps started by the seapilot universal comsumers
// // in this case we only consider cpu cores
// if ( coresPerNode <= TSEsPerNode || TSEsPerNode == 0 )
// {
// if (coresPerNode > 1)
// numESPsPerNode = DEFAULT_ESPS_PER_NODE;
// }
// else if (coresPerNode > (TSEsPerNode*2))
// {
// numESPsPerNode = TSEsPerNode;
// }
// else if (TSEsPerNode > 1)
// {
// numESPsPerNode = TSEsPerNode/2;
// }
// else // not really needed since numESPsPerNode is set to 1 from above
// {
// numESPsPerNode = DEFAULT_ESPS_PER_NODE;
// }
//
// return (float)(numESPsPerNode)/(float)(coresPerNode);
}
enum DefaultConstants NADefaults::holdOrRestore (const char *attrName,
Lng32 holdOrRestoreCQD)
{
DefaultConstants attrEnum = __INVALID_DEFAULT_ATTRIBUTE;
if (holdOrRestoreCQD == 0)
{
*CmpCommon::diags() << DgSqlCode(-2050)
<< DgString0(attrName);
return attrEnum;
}
// Perform a lookup for the string, using a binary search.
attrEnum = lookupAttrName(attrName, -1);
if (attrEnum < 0)
{
*CmpCommon::diags() << DgSqlCode(-2050)
<< DgString0(attrName);
return attrEnum;
}
char * value = NULL;
if (holdOrRestoreCQD == 1) // hold cqd
{
if (currentDefaults_[attrEnum])
{
value = new NADHEAP char[strlen(currentDefaults_[attrEnum]) + 1];
strcpy(value, currentDefaults_[attrEnum]);
}
else
{
value = new NADHEAP char[strlen(defaultDefaults[defDefIx_[attrEnum]].value) + 1];
strcpy(value, defaultDefaults[defDefIx_[attrEnum]].value);
}
if (! heldDefaults_[attrEnum])
heldDefaults_[attrEnum] = new NADHEAP HeldDefaults();
heldDefaults_[attrEnum]->pushDefault(value);
}
else
{
// restore cqd from heldDefaults_ array, if it was held.
if (! heldDefaults_[attrEnum])
return attrEnum;
value = heldDefaults_[attrEnum]->popDefault();
if (! value)
return attrEnum;
// there is an odd semantic that if currentDefaults_[attrEnum]
// is null, we leave it as null, but pop a held value anyway;
// this semantic was preserved when heldDefaults_ was converted
// to a stack.
if (currentDefaults_[attrEnum])
{
// do a validateAndInsert so the caches (such as currentToken_)
// get updated and so appropriate semantic actions are taken.
// Note that validateAndInsert will take care of deleting the
// storage currently held by currentDefaults_[attrEnum].
NAString valueS(value);
validateAndInsert(lookupAttrName(attrEnum), // sad that we have to do a lookup again
valueS,
FALSE);
}
NADELETEBASIC(value, NADHEAP);
}
return attrEnum;
}
const SqlParser_NADefaults *NADefaults::getSqlParser_NADefaults()
{
return SqlParser_NADefaults_;
}
static void setCatSchErr(NAString &value,
Lng32 sqlCode,
Int32 errOrWarn,
NABoolean catErr = FALSE)
{
if (!sqlCode || !errOrWarn) return;
TrimNAStringSpace(value); // prettify further (neater errmsg)
*CmpCommon::diags() << DgSqlCode(ERRWARN(sqlCode))
<< DgCatalogName(value) << DgSchemaName(value)
<< DgString0(value) << DgString1(value);
if (value.first('"') == NA_NPOS) { // delimited names too complicated !
NAString namepart = value;
size_t dot = value.first('.');
if (dot != NA_NPOS) {
namepart.remove(dot);
if (!IsSqlReservedWord(namepart)) {
namepart = value;
namepart.remove(0, dot+1);
}
}
if (IsSqlReservedWord(namepart)) {
*CmpCommon::diags() << DgSqlCode(ERRWARN(3128))
<< DgString0(namepart) << DgString1(namepart);
return;
}
}
// must determine if the defaults have been set up before parseDML is called
if (IdentifyMyself::GetMyName() == I_AM_UNKNOWN){
return; // diagnostic already put into diags above.
}
// Produce additional (more informative) syntax error messages,
// trying delimited-value first and then possibly regular-value-itself.
Parser parser(CmpCommon::context());
Lng32 errs = CmpCommon::diags()->getNumber(DgSqlCode::ERROR_);
NAString pfx(catErr ? "SET CATALOG " : "SET SCHEMA ");
NAString stmt;
char c = *value.data();
if (c && c != '\"') {
stmt = pfx;
stmt += "\"";
stmt += value;
stmt += "\"";
stmt += ";";
parser.parseDML(stmt, stmt.length(),
OBJECTNAMECHARSET
);
}
if (errs == CmpCommon::diags()->getNumber(DgSqlCode::ERROR_)) {
stmt = pfx;
stmt += value;
stmt += ";";
parser.parseDML(stmt, stmt.length(),
OBJECTNAMECHARSET
);
}
// Change errors to warnings if errOrWarn is +1 (i.e. warning).
if (errOrWarn > 0) NegateAllErrors(CmpCommon::diags());
}
NABoolean NADefaults::setCatalog(NAString &value,
Int32 errOrWarn,
NABoolean overwrite,
NABoolean alreadyCanonical)
{
setCatUserID(currentState_ == COMPUTED);
// The input value is in external (Ansi) format.
// If we are in the COMPUTED currentState_,
// make the value strictly canonical,
// and try non-delimited first, then delimited.
// Prettify removes lead/trailing blanks,
// and upcases where unquoted (for nicer errmsgs);
// ComSchemaName parses/validates.
//
if (alreadyCanonical)
; // leave it alone, for performance's sake
else if (currentState_ == COMPUTED) { // ' SQL.FOO'
TrimNAStringSpace(value); // 'SQL.FOO'
NAString tmp(value);
value = ToAnsiIdentifier(value); // nondelim ok?
if (value.isNull()) value = NAString("\"") + tmp + "\""; // '"SQL.FOO"'
}
else
PrettifySqlText(value);
ComSchemaName nam(value);
if (nam.getSchemaNamePart().isEmpty() || // 0 name parts, if *any* error
!nam.getCatalogNamePart().isEmpty()) { // 2 parts (cat.sch) is an error
setCatSchErr(value, EXE_INVALID_CAT_NAME, errOrWarn, TRUE);
return FALSE; // invalid value
}
else {
// Get the 1 name part (the "schema" part as far as ComSchema knows...)
if (overwrite) insert(CATALOG, nam.getSchemaNamePartAsAnsiString());
return TRUE;
}
}
NABoolean NADefaults::setSchema(NAString &value,
Int32 errOrWarn,
NABoolean overwrite,
NABoolean alreadyCanonical)
{
// if this is part of CQD *RESET and it was initialized with role name
// do not change the following flags
// to allow DEFAULT_SCHEMA_NAMETYPE to set its value
if (!( schSetToUserID() && isResetAll() ))
{
setSchUserID(currentState_ == COMPUTED);
setSchByNametype(FALSE);
}
if (alreadyCanonical)
; // leave it alone, for performance's sake
else if (currentState_ == COMPUTED) { // ' SQL.FOO'
TrimNAStringSpace(value); // 'SQL.FOO'
NAString tmp(value);
value = ToAnsiIdentifier(value); // nondelim ok?
if (value.isNull()) value = NAString("\"") + tmp + "\""; // '"SQL.FOO"'
}
else
PrettifySqlText(value);
ComSchemaName nam(value);
if (nam.getSchemaNamePart().isEmpty()) { // 0 name parts, if *any* error
setCatSchErr(value, EXE_INVALID_SCH_NAME, errOrWarn);
return FALSE; // invalid value
}
else {
if (overwrite)
insert(SCHEMA,
nam.getSchemaNamePartAsAnsiString());
// If 2 parts, overwrite any prior catalog default
if (!nam.getCatalogNamePart().isEmpty()) {
if (overwrite)
{
insert(CATALOG,
nam.getCatalogNamePartAsAnsiString());
if (currentState_ == SET_BY_CQD)
{
// indicate that this attribute was set by a user CQD.
setUserDefault(CATALOG, TRUE);
}
}
}
return TRUE;
}
}
NAString NADefaults::keyword(DefaultToken tok)
{
CMPASSERT(tok >= 0 && tok < DF_lastToken);
return keywords_[tok];
}
// Defaults Tokens
// There is a set of keywords which can appear as values of Defaults entries
// in the Defaults Table. We declare, for each such token, a string (the
// keyword), and an enumeration value. The string values belong in an
// array, DFkeywords, in sorted order. The idea is we can use binary
// search in order to obtain the index of a string to the matching
// entry in this sorted array.
//
// If we define the enumerations carefully (pay attention here!), then
// that index we just found (see previous paragraph) is the enum value
// of the token.
// In simple words: this has to be in identical order with enum DefaultToken
// in DefaultConstants.h
const char *NADefaults::keywords_[DF_lastToken] = {
"ACCUMULATED",
"ADVANCED",
"AGGRESSIVE",
"ALL",
"ANSI",
"BEGINNER",
"BOTH",
"CLEAR",
"DEBUG",
"DISK",
"DISK_POOL",
"DUMP",
"DUMP_MV",
"EXTERNAL",
"EXTERNAL_DETAILED",
"FIRSTROW",
"HARDWARE",
"HEAP",
"HIGH",
"HYBRID",
"IEEE",
"INDEXES",
"INTERNAL",
"IQS",
"JNI",
"JNI_TRX",
"KEYINDEXES",
"LASTROW",
"LATEST",
"LEAF",
"LOADNODUP",
"LOCAL",
"LOCAL_NODE",
"LOG",
"MAXIMUM",
"MEDIUM",
"MEDIUM_LOW",
"MERGE",
"MINIMUM",
"MMAP",
"MULTI_NODE",
"MVCC",
"NONE",
"OFF",
"ON",
"OPENS_FOR_WRITE",
"OPERATOR",
"OPTIMAL",
"ORDERED",
"PERTABLE",
"PRINT",
"PRIVATE",
"PUBLIC",
"QS",
"READ_COMMITTED",
"READ_UNCOMMITTED",
"RELEASE",
"REMOTE",
"REPEATABLE_READ",
"REPLACE",
"REPSEL",
"RESOURCES",
"RETURN",
"ROOT",
"SAMPLE",
"SERIALIZABLE",
"SHORTANSI",
"SIMPLE",
"SKIP",
"SMD",
"SOFTWARE",
"SOURCE",
"SQLMP",
"SSCC",
"SSD",
"STOP",
"SUFFIX",
"SYSTEM",
"TANDEM",
"THRIFT",
"USER",
"VERTICAL",
"WAIT",
"WARN",
"XML"
};
// To call bsearch we must satisfy each of its arguments. Either
// NULL comes back, or, comes back a pointer to the element which is
// a true match for our key. bsearch.key is upperKey.data().
// bsearch.base is keywords_. nel is DF_lastToken.
// The next argument is sizeof char*. Finally, the comparison
// function can simply be the strcmp function.
//
// Note that this function makes heavy reliance on the idea that
// the DefaultToken enumerations go up in sequence 0, 1, 2, 3... .
//
// We do the cast on strcmp because its signature from the header
// file is: int (*)(const char *, const char *). In general, we're
// doing a lot of type casting in here.
static Int32 stringCompare(const void* s1, const void* s2)
{ return strcmp( * (char**) s1, * (char**) s2); }
DefaultToken NADefaults::token(Int32 attrEnum,
NAString &value,
NABoolean valueAlreadyGotten,
Int32 errOrWarn) const
{
ATTR_RANGE_ASSERT;
if (!valueAlreadyGotten) {
value = getValue(attrEnum); // already trim & upper (by validateAndInsert)
TrimNAStringSpace(value); // can't trust that the stored value is canonical
}
else {
TrimNAStringSpace(value); // can't trust that input value is canonical,
value.toUpper(); // so here do what validateAndInsert does
}
DefaultToken tok = DF_noSuchToken;
if (value.isNull())
tok = DF_SYSTEM;
else {
if ((attrEnum == TERMINAL_CHARSET) ||
(attrEnum == USE_HIVE_SOURCE) ||
(attrEnum == HIVE_FILE_CHARSET) ||
(attrEnum == HBASE_DATA_BLOCK_ENCODING_OPTION) ||
(attrEnum == HBASE_MEMSTORE_FLUSH_SIZE_OPTION) ||
(attrEnum == HBASE_COMPRESSION_OPTION))
return DF_USER;
if ( attrEnum == NATIONAL_CHARSET ||
attrEnum == DEFAULT_CHARSET ||
attrEnum == HIVE_DEFAULT_CHARSET ||
attrEnum == ISO_MAPPING ||
attrEnum == INPUT_CHARSET ||
attrEnum == TRAF_DEFAULT_COL_CHARSET )
{
CharInfo::CharSet cs = CharInfo::getCharSetEnum(value);
Int32 err_found = 0;
if ( !CharInfo::isCharSetSupported(cs) )
{
err_found = 1;
} else {
switch( attrEnum ) {
case NATIONAL_CHARSET:
if (cs == CharInfo::KANJI_MP) break; //Allow (for regression test)
if ((cs != CharInfo::UNICODE) && (cs != CharInfo::ISO88591))
err_found = 1;
break;
case DEFAULT_CHARSET:
if (cs != CharInfo::ISO88591
&& cs != CharInfo::UTF8
// && cs != CharInfo::SJIS
)
err_found = 1;
break;
case HIVE_DEFAULT_CHARSET:
case TRAF_DEFAULT_COL_CHARSET:
if ((cs != CharInfo::UTF8) && (cs != CharInfo::ISO88591))
err_found = 1;
break;
case ISO_MAPPING:
if (cs != CharInfo::ISO88591)
err_found = 1;
break;
default:
break;
}
}
if ( (err_found != 0) && errOrWarn )
*CmpCommon::diags() << DgSqlCode(ERRWARN(3010)) << DgString0(value);
else
return DF_USER; // kludge, return any valid token
} //else
//else fall thru to see if value is SYSTEM
// OPTIMIZATION_LEVEL
if ((attrEnum == OPTIMIZATION_LEVEL) &&
value.length() == 1)
switch (*value.data()) {
case '0': return DF_MINIMUM;
case '1': return DF_MINIMUM;
case '2': return DF_MEDIUM_LOW;
case '3': return DF_MEDIUM;
case '4': return DF_MEDIUM;
case '5': return DF_MAXIMUM;
}
// PCODE_OPT_LEVEL
if ((attrEnum == PCODE_OPT_LEVEL) &&
value.length() == 1)
switch (*value.data()) {
case '0': return DF_MINIMUM;
case '1': return DF_MEDIUM;
case '2': return DF_HIGH;
case '3': return DF_MAXIMUM;
}
// HBASE_FILTER_PREDS
if ((attrEnum == HBASE_FILTER_PREDS) && value.length()==1)
switch (*value.data()){
case '0': return DF_OFF;
case '1': return DF_MINIMUM;
case '2': return DF_MEDIUM;
// in the future add DF_HIGH and DF_MAXIMUM when we implement more
// pushdown capabilities
}
if (attrEnum == MVQR_REWRITE_CANDIDATES ||
attrEnum == MVQR_WORKLOAD_ANALYSIS_MV_NAME ||
attrEnum == HIST_SCRATCH_VOL)
return DF_SYSTEM;
const char *k = value.data();
char *match = (char*) bsearch(
&k, keywords_, DF_lastToken, sizeof(char*), stringCompare);
if (match)
tok = (DefaultToken) (((const char**) match) - keywords_);
else { // Check for synonyms
const char *c = value;
for (; *c == '0'; c++) ; // all ascii '0' ?
if (*c == '\0') // terminating nul '\0'
tok = DF_OFF;
else if (value.length() <= 2) {
if (value == "1" || value == "+1" || value == "-1")
tok = DF_ON;
}
else {
if ((value == "STOP_AT") || (value == "STOP AT"))
tok = DF_STOP;
else if (value == "READ COMMITTED")
tok = DF_READ_COMMITTED;
else if (value == "READ UNCOMMITTED")
tok = DF_READ_UNCOMMITTED;
else if (value == "REPEATABLE READ")
tok = DF_REPEATABLE_READ;
else if (value == "BEGINNER")
tok = DF_BEGINNER;
else if (value == "ADVANCED")
tok = DF_ADVANCED;
#define CONVERT_SYNONYM(from,to) \
else if (value == "" # from "") { \
CMPASSERT(DF_ ## from == DF_ ## to); \
tok = DF_ ## to; \
}
CONVERT_SYNONYM(COMPAQ, TANDEM)
CONVERT_SYNONYM(DISABLE, OFF)
CONVERT_SYNONYM(ENABLE, SYSTEM)
CONVERT_SYNONYM(FALSE, OFF)
CONVERT_SYNONYM(FULL, MAXIMUM)
CONVERT_SYNONYM(TRUE, ON)
}
}
}
NABoolean isValid = FALSE;
if (tok != DF_noSuchToken)
switch (attrEnum) {
case DEFAULT_SCHEMA_ACCESS_ONLY:
if (tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
case DEFAULT_SCHEMA_NAMETYPE:
if (tok == DF_SYSTEM || tok == DF_USER)
isValid = TRUE;
break;
case DETAILED_STATISTICS:
if (tok == DF_ALL ||
tok == DF_ACCUMULATED || tok == DF_OPERATOR ||
tok == DF_PERTABLE || tok == DF_OFF)
isValid = TRUE;
break;
case HIDE_INDEXES:
if (tok == DF_NONE || tok == DF_ALL ||
tok == DF_VERTICAL || tok == DF_INDEXES || tok == DF_KEYINDEXES)
isValid = TRUE;
break;
case HIVE_USE_EXT_TABLE_ATTRS:
if (tok == DF_ALL || tok == DF_OFF || tok == DF_ON )
isValid = TRUE;
break;
case INDEX_ELIMINATION_LEVEL:
if (tok == DF_MINIMUM || tok == DF_MEDIUM ||
tok == DF_MAXIMUM || tok == DF_AGGRESSIVE )
isValid = TRUE;
break;
case IF_LOCKED:
if (tok == DF_RETURN || tok == DF_WAIT)
isValid = TRUE;
break;
case INSERT_VSBB:
if (tok == DF_OFF || tok == DF_LOADNODUP ||
tok == DF_SYSTEM || tok == DF_USER)
isValid = TRUE;
break;
case OVERFLOW_MODE:
if (tok == DF_DISK || tok == DF_SSD ||
tok == DF_MMAP)
isValid = TRUE;
break;
case SORT_ALGO:
if(tok == DF_HEAP || tok == DF_IQS ||
tok == DF_REPSEL || tok == DF_QS)
isValid = TRUE;
break;
case QUERY_TEMPLATE_CACHE:
case SHARE_TEMPLATE_CACHED_PLANS:
case VSBB_TEST_MODE:
if (tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
case QUERY_TEXT_CACHE:
if (tok == DF_ON || tok == DF_OFF || tok == DF_SYSTEM || tok == DF_SKIP)
isValid = TRUE;
break;
case DISABLE_BUFFERED_INSERTS:
if (tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
case ISOLATION_LEVEL:
{
TransMode::IsolationLevel iltmp;
isValid = getIsolationLevel(iltmp, tok);
}
break;
case ISOLATION_LEVEL_FOR_UPDATES:
{
TransMode::IsolationLevel iltmp;
isValid = getIsolationLevel(iltmp, tok);
}
break;
case MVGROUP_AUTOMATIC_CREATION:
case MV_TRACE_INCONSISTENCY: //++ MV
case MV_AS_ROW_TRIGGER: //++ MV
{
if(DF_ON == tok || DF_OFF == tok)
{
isValid = TRUE;
}
}
break;
case IUD_NONAUDITED_INDEX_MAINT:
if (tok == DF_OFF || tok == DF_SYSTEM ||
tok == DF_WARN || tok == DF_ON)
isValid = TRUE;
break;
case HIVE_SCAN_SPECIAL_MODE:
isValid = TRUE;
break;
case IS_SQLCI:
// for primary mxcmp that is invoked for user queries, the only valid
// value for mxci_process cqd is TRUE. This cqd is set once by mxci
// at startup time and cannot be changed by user. That way we know that
// a request has come in from mxci(trusted) process.
// For secondary mxcmp's invoked for internal queries where cqd's are
// sent using sendAllControls method, all values are valid. This will
// ensure that if this default is not set and is sent over to secondary
// mxcmp using an internal CQD statement, it doesn't return an error.
if (tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
case NVCI_PROCESS:
// for primary mxcmp that is invoked for user queries, the only valid
// value for nvci_process cqd is TRUE. This cqd is set once by nvci
// at startup time and cannot be changed by user. That way we know that
// a request has come in from nvci(trusted) process.
// For secondary mxcmp's invoked for internal queries where cqd's are
// sent using sendAllControls method, all values are valid. This will
// ensure that if this default is not set and is sent over to secondary
// mxcmp using an internal CQD statement, it doesn't return an error.
if (tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
case NAMETYPE:
if (tok == DF_ANSI || tok == DF_SHORTANSI)
isValid = TRUE;
break;
case OPTIMIZATION_GOAL:
if (tok == DF_FIRSTROW || tok == DF_LASTROW ||
tok == DF_RESOURCES)
isValid = TRUE;
break;
case USER_EXPERIENCE_LEVEL:
if (tok == DF_ADVANCED || tok == DF_BEGINNER)
isValid = TRUE;
break;
case PCODE_OPT_LEVEL:
if (tok == DF_OFF)
{
isValid = TRUE;
break;
}
// else fall through to the next case, all those keywords are allowed
// as well
case ATTEMPT_ESP_PARALLELISM:
if (tok == DF_SYSTEM || tok == DF_ON ||
tok == DF_OFF || tok == DF_MAXIMUM)
isValid = TRUE;
break;
case OPTIMIZATION_LEVEL:
if (tok == DF_MINIMUM || tok == DF_MEDIUM_LOW ||
tok == DF_MEDIUM || tok == DF_MAXIMUM)
isValid = TRUE;
break;
case HBASE_FILTER_PREDS:
if(tok == DF_OFF || tok == DF_ON)
{
if (tok == DF_ON)
tok = DF_MINIMUM; // to keep backward compatibility
isValid= TRUE;
}
break;
case ROBUST_QUERY_OPTIMIZATION:
if (tok == DF_MINIMUM || tok == DF_SYSTEM || tok == DF_MAXIMUM ||
tok == DF_HIGH)
isValid = TRUE;
break;
case REFERENCE_CODE:
case TARGET_CODE:
if (tok == DF_RELEASE || tok == DF_DEBUG)
isValid = TRUE;
break;
/* case ROLLBACK_ON_ERROR:
if (tok == DF_OFF || tok == DF_ON ||
tok == DF_SYSTEM)
isValid = TRUE;
break;
*/
case AUTO_QUERY_RETRY:
if (tok == DF_ON ||
tok == DF_OFF ||
tok == DF_SYSTEM)
isValid = TRUE;
break;
case AUTO_QUERY_RETRY_WARNINGS:
case USE_LIBHDFS:
if (tok == DF_ON ||
tok == DF_OFF)
isValid = TRUE;
break;
case EXE_PARALLEL_DDL:
if (tok == DF_OFF ||
tok == DF_ON ||
tok == DF_EXTERNAL ||
tok == DF_INTERNAL)
isValid = TRUE;
break;
case UNAVAILABLE_PARTITION:
if (tok == DF_SKIP || tok == DF_STOP)
isValid = TRUE;
break;
case QUERY_CACHE_STATISTICS:
// on, off are no-ops
if (tok == DF_PRINT || tok == DF_ON || tok == DF_OFF) isValid = TRUE;
break;
case QUERY_CACHE_STATEMENT_PINNING:
if (tok == DF_CLEAR || tok == DF_ON || tok == DF_OFF) isValid = TRUE;
break;
case HJ_TYPE:
if (tok == DF_ORDERED || tok == DF_HYBRID || tok == DF_SYSTEM)
isValid = TRUE;
break;
case REF_CONSTRAINT_NO_ACTION_LIKE_RESTRICT:
if (tok == DF_OFF || tok == DF_ON ||
tok == DF_SYSTEM)
isValid = TRUE;
break;
case POS:
if (tok == DF_LOCAL_NODE || tok == DF_OFF ||
tok == DF_MULTI_NODE || tok == DF_DISK_POOL)
isValid = TRUE;
break;
case USTAT_INTERNAL_SORT:
if (tok == DF_ON || tok == DF_OFF || tok == DF_HYBRID)
isValid = TRUE;
break;
case USTAT_AUTO_FOR_VOLATILE_TABLES:
if (tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
case SUBQUERY_UNNESTING:
if (tok == DF_OFF || tok == DF_ON || tok == DF_DEBUG)
isValid = TRUE;
break;
case SUBQUERY_UNNESTING_P2:
if (tok == DF_OFF || tok == DF_ON || tok == DF_INTERNAL)
isValid = TRUE;
break;
case SORT_INTERMEDIATE_SCRATCH_CLEANUP:
if(tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
case SORT_MEMORY_QUOTA_SYSTEM:
if(tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
/*
If MDAM_SCAN_METHOD's value is "MAXIMUM" only, Right side of Nested Join will
use the MDAM path
Allowable values for MDAM_SCAN_METHOD are 'ON' | 'OFF' | 'MAXIMUM'
*/
case MDAM_SCAN_METHOD:
if (tok == DF_ON || tok == DF_OFF || tok == DF_MAXIMUM)
isValid = TRUE;
break;
case SHOWDDL_DISPLAY_FORMAT:
if (tok == DF_INTERNAL || tok == DF_EXTERNAL || tok == DF_LOG)
isValid = TRUE;
break;
case SHOWDDL_DISPLAY_PRIVILEGE_GRANTS:
if (tok == DF_SYSTEM || tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
case EXPLAIN_DISPLAY_FORMAT:
if (tok == DF_INTERNAL || tok == DF_EXTERNAL || tok == DF_EXTERNAL_DETAILED)
isValid = TRUE;
break;
case UPDATE_CLUSTERING_OR_UNIQUE_INDEX_KEY:
if (tok == DF_ON || tok == DF_OFF || tok == DF_AGGRESSIVE)
isValid = TRUE;
break;
case MVQR_ALL_JBBS_IN_QD:
case MVQR_REWRITE_ENABLED_OPTION:
case MVQR_REWRITE_SINGLE_TABLE_QUERIES:
case MVQR_USE_EXTRA_HUB_TABLES:
case MVQR_ENABLE_LOGGING:
if (tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
case MVQR_LOG_QUERY_DESCRIPTORS:
if (tok == DF_OFF || tok == DF_DUMP || tok == DF_DUMP_MV || tok == DF_LOG)
isValid = TRUE;
break;
case MVQR_PRIVATE_QMS_INIT:
if (tok == DF_SMD || tok == DF_XML || tok == DF_NONE)
isValid = TRUE;
break;
case MVQR_PUBLISH_TO:
if (tok == DF_PUBLIC || tok == DF_PRIVATE || tok == DF_BOTH || tok == DF_NONE)
isValid = TRUE;
break;
case MVQR_WORKLOAD_ANALYSIS_MV_NAME:
isValid = TRUE;
break;
case ELIMINATE_REDUNDANT_JOINS:
if (tok == DF_OFF || tok == DF_ON || tok == DF_DEBUG || tok == DF_MINIMUM)
isValid = TRUE;
break;
case VOLATILE_TABLE_FIND_SUITABLE_KEY:
if (tok == DF_SYSTEM || tok == DF_ON ||
tok == DF_OFF)
isValid = TRUE;
break;
case CAT_DISTRIBUTE_METADATA:
if (tok == DF_OFF || tok == DF_LOCAL_NODE || tok == DF_ON)
isValid = TRUE;
break;
case MV_DUMP_DEBUG_INFO:
if (tok == DF_OFF || tok == DF_ON)
isValid = TRUE;
break;
case RANGESPEC_TRANSFORMATION:
if (tok == DF_OFF || tok == DF_ON || tok == DF_MINIMUM)
isValid = TRUE;
break;
case ASYMMETRIC_JOIN_TRANSFORMATION:
if (tok == DF_MINIMUM || tok == DF_MAXIMUM)
isValid = TRUE;
break;
case CAT_DEFAULT_COMPRESSION:
if (tok == DF_NONE || tok == DF_HARDWARE || tok == DF_SOFTWARE)
isValid = TRUE;
break;
case REPLICATE_DISK_POOL:
if (tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
case COMPRESSION_TYPE:
if (tok == DF_NONE || tok == DF_HARDWARE || tok == DF_SOFTWARE)
isValid = TRUE;
break;
// The DF_SAMPLE setting indicates that the persistent sample will be
// updated incrementally, but not the histograms; they will be created
// anew from the incrementally updated sample.
case USTAT_INCREMENTAL_UPDATE_STATISTICS:
if (tok == DF_OFF || tok == DF_SAMPLE || tok == DF_ON)
isValid = TRUE;
break;
case REPLICATE_COMPRESSION_TYPE:
if (tok == DF_NONE || tok == DF_HARDWARE || tok == DF_SOFTWARE
|| tok == DF_SOURCE || tok == DF_SYSTEM)
isValid = TRUE;
break;
case REUSE_OPENS:
if (tok==DF_ON || tok == DF_OFF || tok == DF_OPENS_FOR_WRITE)
isValid = TRUE;
break;
case USE_HIVE_SOURCE:
isValid = TRUE;
break;
case TRAF_SIMILARITY_CHECK:
if (tok == DF_ROOT || tok == DF_LEAF || tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
case TRAF_TABLE_SNAPSHOT_SCAN:
if (tok == DF_NONE || tok == DF_SUFFIX || tok == DF_LATEST)
isValid = TRUE;
break;
case TRAF_TRANS_TYPE:
if (tok == DF_MVCC || tok == DF_SSCC)
isValid = TRUE;
break;
case HBASE_RANGE_PARTITIONING_PARTIAL_COLS:
if (tok == DF_OFF || tok == DF_MINIMUM ||
tok == DF_MEDIUM || tok == DF_MAXIMUM || tok == DF_ON)
isValid = TRUE;
break;
case TRAF_UPSERT_MODE:
if (tok == DF_MERGE || tok == DF_REPLACE || tok == DF_OPTIMAL)
isValid = TRUE;
break;
// Nothing needs to be added here for ON/OFF/SYSTEM keywords --
// instead, add to DEFAULT_ALLOWS_SEPARATE_SYSTEM code in the ctor.
default:
if (tok == DF_ON || tok == DF_OFF)
isValid = TRUE;
break;
}
// See "NOTE 2" way up top.
if (!isValid) {
if (tok == DF_SYSTEM) {
isValid = isFlagOn(attrEnum, DEFAULT_ALLOWS_SEPARATE_SYSTEM);
if (!isValid) {
NAString tmp(getDefaultDefaultValue(attrEnum));
isValid = isSynonymOfSYSTEM(attrEnum, tmp);
}
}
}
if (!isValid) {
tok = DF_noSuchToken;
if (errOrWarn)
*CmpCommon::diags() << DgSqlCode(ERRWARN(2055))
<< DgString0(value) << DgString1(lookupAttrName(attrEnum));
}
return tok;
}
DefaultToken NADefaults::getToken( const Int32 attrEnum,
const Int32 errOrWarn ) const
{
// Check the cache first.
if ( currentTokens_[attrEnum] != NULL )
{
return *currentTokens_[attrEnum];
}
// Get the token and allocate memory to store the token value.
NAString tmp( NADHEAP );
currentTokens_[attrEnum] = new NADHEAP DefaultToken;
*currentTokens_[attrEnum] = token( attrEnum, tmp, FALSE, errOrWarn );
return *currentTokens_[attrEnum];
}
NABoolean NADefaults::getIsolationLevel(TransMode::IsolationLevel &arg,
DefaultToken tok) const
{
NABoolean specifiedOK = TRUE;
if (tok == DF_noSuchToken)
tok = getToken(ISOLATION_LEVEL);
switch (tok) {
case DF_READ_COMMITTED: arg = TransMode::READ_COMMITTED_; break;
case DF_READ_UNCOMMITTED: arg = TransMode::READ_UNCOMMITTED_; break;
case DF_REPEATABLE_READ: arg = TransMode::REPEATABLE_READ_; break;
case DF_SERIALIZABLE:
case DF_SYSTEM: arg = TransMode::SERIALIZABLE_; break;
case DF_NONE: arg = TransMode::IL_NOT_SPECIFIED_; break;
default: arg = TransMode::SERIALIZABLE_;
specifiedOK = FALSE;
NAString value(NADHEAP);
if (tok != DF_noSuchToken) value = keyword(tok);
*CmpCommon::diags() << DgSqlCode(-2055)
<< DgString0(value)
<< DgString1("ISOLATION_LEVEL");
}
return specifiedOK;
}
// find the packed length for all the default values stored
// in currentDefaults_ array.
// currentDefaults_ is a fixed sized array of "char *" where each
// entry is pointing to the default value for that default.
// After pack, the default values are put in the buffer in
// sequential order with a null terminator.
Lng32 NADefaults::packedLengthDefaults()
{
Lng32 size = 0;
const size_t numAttrs = numDefaultAttributes();
for (size_t i = 0; i < numAttrs; i++)
{
size += strlen(currentDefaults_[i]) + 1;
}
return size;
}
Lng32 NADefaults::packDefaultsToBuffer(char * buffer)
{
const size_t numAttrs = numDefaultAttributes();
Lng32 totalSize = 0;
Lng32 size = 0;
for (UInt32 i = 0; i < numAttrs; i++)
{
size = (Lng32)strlen(currentDefaults_[i]) + 1;
strcpy(buffer, currentDefaults_[i]);
buffer += size;
totalSize += size;
}
return totalSize;
}
Lng32 NADefaults::unpackDefaultsFromBuffer(Lng32 numEntriesInBuffer,
char * buffer)
{
return 0;
}
NABoolean NADefaults::isSameCQD(Lng32 numEntriesInBuffer,
char * buffer, Lng32 bufLen)
{
const Lng32 numCurrentDefaultAttrs = (Lng32)numDefaultAttributes();
// check to see if the default values in 'buffer' are the same
// as those in the currentDefaults_ array.
// Return TRUE if they are all the same.
if (numCurrentDefaultAttrs != numEntriesInBuffer)
return FALSE;
if (bufLen == 0)
return FALSE;
Int32 curPos = 0;
for (Int32 i = 0; i < numEntriesInBuffer; i++)
{
if (strcmp(currentDefaults_[i], &buffer[curPos]) != 0)
return FALSE;
curPos += strlen(&buffer[curPos]) + 1;
}
// everything matches.
return TRUE;
}
void NADefaults::updateCurrentDefaultsForOSIM(DefaultDefault * defaultDefault,
NABoolean validateFloatVal)
{
Int32 attrEnum = defaultDefault->attrEnum;
const char * defaultVal = defaultDefault->value;
const char * valueStr = currentDefaults_[attrEnum];
if(valueStr)
{
NADELETEBASIC(valueStr,NADHEAP);
}
char * value = new NADHEAP char[strlen(defaultVal) + 1];
strcpy(value, defaultVal);
currentDefaults_[attrEnum] = value;
if ( validateFloatVal )
{
float floatVal = 0;
if (validateFloat(currentDefaults_[attrEnum], floatVal, attrEnum)) {
if (currentFloats_[attrEnum]) {
NADELETEBASIC(currentFloats_[attrEnum], NADHEAP);
}
currentFloats_[attrEnum] = new NADHEAP float;
*currentFloats_[attrEnum] = floatVal;
}
}
if ( currentTokens_[attrEnum] )
{
if (provenances_[attrEnum] > INIT_DEFAULT_DEFAULTS)
NADELETEBASIC( currentTokens_[attrEnum], NADHEAP );
currentTokens_[attrEnum] = NULL;
}
}
void NADefaults::setSchemaAsLdapUser(const NAString val)
{
NAString ldapUsername = val;
if ( ldapUsername.isNull() )
ldapUsername = getValue(LDAP_USERNAME);
if ( ldapUsername.isNull() )
return;
ldapUsername.toUpper();
NAString schName = '"';
schName += ldapUsername;
schName += '"';
// check schema name before insert
// may get special characters from ldap
ComSchemaName cSchName(schName);
if ( !cSchName.getSchemaNamePart().isEmpty() &&
cSchName.getCatalogNamePart().isEmpty()) // should have no catalog
{
insert(SCHEMA, schName);
}
else
{ *CmpCommon::diags() << DgSqlCode(-2055)
<< DgString0(schName)
<< DgString1("SCHEMA");
}
}