/* Copyright (C) 2014 InfiniDB, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "bpp.h" #include "pseudocolumn.h" using namespace std; using namespace execplan; namespace primitiveprocessor { PseudoCC::PseudoCC() : ColumnCommand() { } PseudoCC::~PseudoCC() { } SCommand PseudoCC::duplicate() { SCommand ret; PseudoCC* pseudo; pseudo = new PseudoCC(); ret.reset(pseudo); pseudo->function = function; pseudo->valueFromUM = valueFromUM; pseudo->bigValueFromUM = bigValueFromUM; ColumnCommand::duplicate(pseudo); return ret; } void PseudoCC::createCommand(messageqcpp::ByteStream& bs) { bs.advance(1); bs >> function; ColumnCommand::createCommand(bs); } void PseudoCC::resetCommand(messageqcpp::ByteStream& bs) { if (function == PSEUDO_EXTENTMAX || function == PSEUDO_EXTENTMIN) { if (!colType.isWideDecimalType()) bs >> valueFromUM; else bs >> bigValueFromUM; } else if (function == PSEUDO_EXTENTID) { bs >> valueFromUM; if (colType.isWideDecimalType()) bigValueFromUM = valueFromUM; } ColumnCommand::resetCommand(bs); } #ifdef __GNUC__ // The "official" GCC version for InfiniDB is 4.5.3. This flag breaks at least 4.4.3 & 4.4.5, // so just don't do it for anything younger than 4.5.0. #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) __attribute__((optimize("no-tree-vectorize"))) #endif #endif void PseudoCC::loadData() { switch (function) { case PSEUDO_PM: switch (colType.colWidth) { case 1: loadPMNumber(); break; case 2: loadPMNumber(); break; case 4: loadPMNumber(); break; case 8: loadPMNumber(); break; case 16: loadPMNumber(); break; default: cout << "PC::loadData(): bad column width" << endl; break; } break; case PSEUDO_EXTENTRELATIVERID: switch (colType.colWidth) { case 1: loadRIDs(); break; case 2: loadRIDs(); break; case 4: loadRIDs(); break; case 8: loadRIDs(); break; case 16: loadRIDs(); break; default: cout << "PC::loadData(): bad column width" << endl; break; } break; case PSEUDO_SEGMENT: switch (colType.colWidth) { case 1: loadSegmentNum(); break; case 2: loadSegmentNum(); break; case 4: loadSegmentNum(); break; case 8: loadSegmentNum(); break; case 16: loadSegmentNum(); break; default: cout << "PC::loadData(): bad column width" << endl; break; } break; case PSEUDO_SEGMENTDIR: switch (colType.colWidth) { case 1: loadPartitionNum(); break; case 2: loadPartitionNum(); break; case 4: loadPartitionNum(); break; case 8: loadPartitionNum(); break; case 16: loadPartitionNum(); break; default: cout << "PC::loadData(): bad column width" << endl; break; } break; case PSEUDO_BLOCKID: switch (colType.colWidth) { case 1: loadLBID(); break; case 2: loadLBID(); break; case 4: loadLBID(); break; case 8: loadLBID(); break; case 16: loadLBID(); break; default: cout << "PC::loadData(): bad column width" << endl; break; } break; case PSEUDO_DBROOT: switch (colType.colWidth) { case 1: loadDBRootNum(); break; case 2: loadDBRootNum(); break; case 4: loadDBRootNum(); break; case 8: loadDBRootNum(); break; case 16: loadDBRootNum(); break; default: cout << "PC::loadData(): bad column width" << endl; break; } break; /* cases where the value to use is sent from the UM */ case PSEUDO_EXTENTMAX: case PSEUDO_EXTENTMIN: case PSEUDO_EXTENTID: switch (colType.colWidth) { case 1: loadSingleValue(valueFromUM); break; case 2: loadSingleValue(valueFromUM); break; case 4: loadSingleValue(valueFromUM); break; case 8: loadSingleValue(valueFromUM); break; case 16: loadSingleValue(bigValueFromUM); break; default: cout << "PC::loadData(): bad column width" << endl; break; } break; default: cout << "PC::loadData(): bad function" << endl; break; } } } // namespace primitiveprocessor