mirror of
https://github.com/levinsv/pgadmin3.git
synced 2026-05-15 14:15:49 -06:00
100 lines
2.1 KiB
C++
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();
|
|
}
|
|
}
|