blob: d36580c1cf7b29f562fe2af99f29e7b1381122d8 [file] [log] [blame]
/**********************************************************************
// @@@ 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 @@@
**********************************************************************/
#ifndef REL_CONTROL_H
#define REL_CONTROL_H
/* -*-C++-*-
*****************************************************************************
*
* File: RelControl.h
* Description: CONTROL statements
*
*
* Created: 6/11/96
* Language: C++
*
*
*
*
*****************************************************************************
*/
#include "DefaultConstants.h"
#include "RelExpr.h"
#include "StmtCompilationMode.h"
#include "charinfo.h"
#include "OptimizerSimulator.h"
class ControlAbstractClass : public RelExpr
{
public:
ControlAbstractClass(OperatorTypeEnum otype,
const NAString &sqlText, CharInfo::CharSet sqlTextCharSet,
const NAString &token,
const NAString &value,
NABoolean dynamic,
CollHeap *h,
Int32 reset=0) :
RelExpr(otype, NULL, NULL, h),
sqlText_(sqlText,h), sqlTextCharSet_(sqlTextCharSet), token_(token,h), value_(value,h),
reset_(reset), dynamic_(dynamic)
{ rewriteControlText(sqlText_, sqlTextCharSet, this);
setNonCacheable();
}
// copy ctor
ControlAbstractClass (const ControlAbstractClass & orig,
CollHeap *h=CmpCommon::statementHeap()); // not written
// virtual destructor
virtual ~ControlAbstractClass();
virtual Int32 getArity() const { return 0; }
virtual NABoolean isPhysical() const { return TRUE; }
virtual HashValue topHash() { return 0; }
virtual void getPotentialOutputValues(ValueIdSet &vs) const { vs.clear(); }
virtual NABoolean isAControlStatement() const { return TRUE; }
virtual StaticOnly isAStaticOnlyStatement() const;
virtual RelExpr *bindNode(BindWA *bindWAPtr);
virtual RelExpr *copyTopNode(RelExpr *derivedNode = NULL, CollHeap *h = NULL);
virtual NABoolean duplicateMatch(const RelExpr &other) const;
virtual PhysicalProperty *synthPhysicalProperty(const Context *context,
const Lng32 planNumber,
PlanWorkSpace *pws);
virtual short codeGen(Generator*); // defined in GenRelDCL.cpp
const NAString &getSqlText() const { return sqlText_; }
CharInfo::CharSet getSqlTextCharSet() const { return sqlTextCharSet_; }
const NAString &getToken() const { return token_; }
const NAString &getValue() const { return value_; }
NAString &mutateToken() { return token_; }
NAString &mutateValue() { return value_; }
Int32 &reset() { return reset_; } // mutator
NABoolean dynamic() const { return dynamic_; }
NABoolean alterArkcmpEnvNow() const;
protected:
static NAString getControlTextPrefix (const ControlAbstractClass *ctrl);
static void rewriteControlText (NAString &sqlText, CharInfo::CharSet sqlTextCharSet,
ControlAbstractClass *ctrl);
NAString sqlText_;
CharInfo::CharSet sqlTextCharSet_;
NAString token_;
NAString value_;
// We need a separate reset flag/counter because we cannot use (value_==""),
// because SET SCHEMA ''; must *NOT* be allowed to mean CQD SCHEMA RESET
// because Ansi says we must issue a syntax error for this.
// It must be an int (values 0, 1, 2) for CQD * RESET RESET;
Int32 reset_; // value is ignored; instead, RESET to prior val
NABoolean dynamic_; // a SET stmt, to be evaluated at runtime
private:
};
// -----------------------------------------------------------------------
// CONTROL QUERY SHAPE statement: used to force complex plans in the
// optimizer. Here is an example for the syntax:
//
// CONTROL QUERY shape root(join(scan(cat.sch.table),scan(sch.index)))
//
// In other words, the shape of the plan generated by the optimizer is
// specified in a functional notation, with each node written as a
// function with (arity) arguments. Some nodes have special arguments,
// like scan, which allows to specify the SQL table or index name.
// -----------------------------------------------------------------------
class ControlQueryShape : public ControlAbstractClass
{
public:
ControlQueryShape(RelExpr *shape,
const NAString &sqlText,
CharInfo::CharSet sqlTextCharSet,
NABoolean holdShape = FALSE,
NABoolean dyn = FALSE,
NABoolean ignoreExchange = FALSE,
NABoolean ignoreSort = FALSE,
CollHeap *h = CmpCommon::statementHeap()) :
// Empty/unused token and value args
ControlAbstractClass(REL_CONTROL_QUERY_SHAPE, sqlText, sqlTextCharSet, "", "", dyn, h),
shape_(shape), holdShape_(holdShape), ignoreExchange_(ignoreExchange),
ignoreSort_(ignoreSort)
{}
// a virtual function for performing name binding within the query tree
virtual RelExpr * bindNode(BindWA *bindWAPtr);
virtual RelExpr * copyTopNode(RelExpr *derivedNode = NULL,
CollHeap *h = NULL);
// get a printable string that identifies the operator
virtual const NAString getText() const;
RelExpr * getShape() { return (holdShape_ ? NULL : shape_); }
void setShape(RelExpr * shape) { shape_ = shape; }
const NAString &getShapeText() { return getSqlText(); }
NABoolean &holdShape() { return holdShape_; }
NABoolean getIgnoreExchange() const { return ignoreExchange_; }
NABoolean getIgnoreSort() const { return ignoreSort_; }
private:
RelExpr * shape_;
// This field is set to TRUE or FALSE by a
// CQS HOLD ON or CQS HOLD OFF stmt.
// if this is TRUE, then ignore previously set CQS.
// But do not remove it. When hold is set to off,
// the previously set shape could be used again.
// The holdShape param passed in to the constructor
// is looked at only if the RelExpr passed in is NULL.
NABoolean holdShape_;
// Should we match sort and EXCHANGE nodes (including
// pa, split_top_pa, and esp_exchange nodes)
// in the shape?
NABoolean ignoreExchange_;
NABoolean ignoreSort_;
};
class ControlQueryDefault : public ControlAbstractClass
{
public:
ControlQueryDefault(const NAString &sqlText, CharInfo::CharSet sqlTextCharSet,
const NAString &token,
const NAString &value,
NABoolean dyn = FALSE,
Lng32 holdOrRestoreCQD = 0,
CollHeap *h = CmpCommon::statementHeap(),
Int32 reset=0);
// copy ctor
ControlQueryDefault (const ControlQueryDefault & orig,
CollHeap *h=CmpCommon::statementHeap()); // not written
// a virtual function for performing name binding within the query tree
virtual RelExpr * bindNode(BindWA *bindWAPtr);
virtual RelExpr * copyTopNode(RelExpr *derivedNode = NULL,
CollHeap *h = NULL);
// get a printable string that identifies the operator
virtual const NAString getText() const;
DefaultConstants getAttrEnum() const { return attrEnum_; }
void setAttrEnum(DefaultConstants a) { attrEnum_ = a; }
Int16 getHoldOrRestoreCQD() {return (Int16) holdOrRestoreCQD_; }
private:
// This is used by the Binder and the arkcmp ControlDB.
// It is NOT emitted by CodeGen, not stored in a compiled module,
// so that programmers are free to add/change/delete from DefaultConstants.h
// without causing versioning problems with previously compiled queries.
DefaultConstants attrEnum_;
// This field is set to 1(hold) or 2(restore) by a
// CQD <defaultName> HOLD or CQS <defaultName> RESTORE stmt.
// With hold, the previously set value for the input 'token'
// is remembered(held).
// With restore, the previously remembered(held) value is restored.
// A value of 0 indicates that this is not a cqd hold/restore stmt.
Lng32 holdOrRestoreCQD_;
};
class ControlTable : public ControlAbstractClass
{
public:
ControlTable(CorrName *tableName,
const NAString &sqlText, CharInfo::CharSet sqlTextCharSet,
const NAString &token,
const NAString &value,
NABoolean dyn = FALSE,
CollHeap *h = CmpCommon::statementHeap());
// copy ctor
ControlTable (const ControlTable &orig,
CollHeap *h=CmpCommon::statementHeap()); // not written
// a virtual function for performing name binding within the query tree
virtual RelExpr * bindNode(BindWA *bindWAPtr);
virtual RelExpr * copyTopNode(RelExpr *derivedNode = NULL,
CollHeap *h = NULL);
// get a printable string that identifies the operator
virtual const NAString getText() const;
const CorrName & getTableName() const
{
if (tableName_)
return *tableName_;
else
return RelExpr::invalid;
};
private:
CorrName* tableName_;
};
class ControlSession : public ControlAbstractClass
{
public:
ControlSession(const NAString &sqlText, CharInfo::CharSet sqlTextCharSet,
const NAString &token,
const NAString &value,
NABoolean dyn = FALSE,
CollHeap *h = CmpCommon::statementHeap());
// copy ctor
ControlSession (const ControlSession &orig,
CollHeap *h=CmpCommon::statementHeap()); // not written
// a virtual function for performing name binding within the query tree
virtual RelExpr * bindNode(BindWA *bindWAPtr);
virtual RelExpr * copyTopNode(RelExpr *derivedNode = NULL,
CollHeap *h = NULL);
// get a printable string that identifies the operator
virtual const NAString getText() const;
private:
};
class SetSessionDefault : public ControlAbstractClass
{
public:
SetSessionDefault(const NAString &sqlText, CharInfo::CharSet sqlTextCharSet,
const NAString &token,
const NAString &value,
CollHeap *h = CmpCommon::statementHeap());
// copy ctor
SetSessionDefault (const SetSessionDefault &orig,
CollHeap *h=CmpCommon::statementHeap()); // not written
// a virtual function for performing name binding within the query tree
virtual RelExpr * bindNode(BindWA *bindWAPtr);
virtual RelExpr * copyTopNode(RelExpr *derivedNode = NULL,
CollHeap *h = NULL);
// get a printable string that identifies the operator
virtual const NAString getText() const;
private:
};
class OSIMControl : public ControlAbstractClass
{
public:
OSIMControl(OptimizerSimulator::osimMode mode,
NAString & localDir,
NABoolean force,
CollHeap * oHeap);
void setForceLoad(NABoolean b) { forceLoad_ = b;}
NABoolean isForceLoad() const { return forceLoad_; }
virtual RelExpr * bindNode(BindWA *bindWAPtr);
virtual RelExpr * copyTopNode(RelExpr *derivedNode = NULL, CollHeap *h = NULL);
private:
// copy ctor
OSIMControl (const OSIMControl &orig,
CollHeap *h=CmpCommon::statementHeap()); // not written, not used
OptimizerSimulator::osimMode targetMode_;
NAString osimLocalDir_;
//in respond to force option of osim load,
//e.g. osim load from '/xxx/xxx/osim-dir', force
//if true, when loading osim tables/views/indexes
//existing objects with same qualified name
//will be droped first
NABoolean forceLoad_;
};
#endif /* REL_CONTROL_H */