pgadmin3/pgscript/expressions/pgsCast.cpp
2020-07-07 22:19:12 +05:00

100 lines
2.1 KiB
C++

//////////////////////////////////////////////////////////////////////////
//
// pgScript - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////////////////
#include "pgAdmin3.h"
#include "pgscript/expressions/pgsCast.h"
#include "pgscript/exceptions/pgsParameterException.h"
#include "pgscript/objects/pgsNumber.h"
#include "pgscript/parser.tab.hh"
typedef pgscript::pgsParser::token token;
pgsCast::pgsCast(const int &cast_type, const pgsExpression *var) :
pgsExpression(), m_cast_type(cast_type), m_var(var)
{
}
pgsCast::~pgsCast()
{
pdelete(m_var);
}
pgsExpression *pgsCast::clone() const
{
return pnew pgsCast(*this);
}
pgsCast::pgsCast(const pgsCast &that) :
pgsExpression(that), m_cast_type(that.m_cast_type)
{
m_var = that.m_var->clone();
}
pgsCast &pgsCast::operator =(const pgsCast &that)
{
if (this != &that)
{
pgsExpression::operator=(that);
m_cast_type = that.m_cast_type;
pdelete(m_var);
m_var = that.m_var->clone();
}
return (*this);
}
wxString pgsCast::value() const
{
wxString cast_type;
switch (m_cast_type)
{
case token::PGS_INTEGER:
cast_type = wxT("integer");
break;
case token::PGS_REAL:
cast_type = wxT("real");
break;
case token::PGS_RECORD:
cast_type = wxT("record");
break;
case token::PGS_STRING:
cast_type = wxT("string");
break;
default:
cast_type = wxT("unknown");
break;
}
return wxString() << wxT("CAST (") << m_var->value() << wxT(" AS ")
<< cast_type.Upper() << wxT(") ");
}
pgsOperand pgsCast::eval(pgsVarMap &vars) const
{
pgsOperand var = m_var->eval(vars);
MAPM num;
switch (m_cast_type)
{
case token::PGS_INTEGER:
num = pgsMapm::pgs_str_mapm(var->number().value());
num = pgsMapm::pgs_mapm_round(num);
return pnew pgsNumber(pgsMapm::pgs_mapm_str(num, true), pgsInt);
case token::PGS_REAL:
return pnew pgsNumber(var->number().value(), pgsReal);
case token::PGS_RECORD:
return var->record().clone();
case token::PGS_STRING:
return var->string().clone();
default:
return var->clone();
}
}