Expression.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright (c) 2021, Jan de Visser <jan@de-visser.net>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibSQL/AST/AST.h>
  7. #include <LibSQL/Database.h>
  8. namespace SQL::AST {
  9. Value Expression::evaluate(ExecutionContext&) const
  10. {
  11. return Value::null();
  12. }
  13. Value NumericLiteral::evaluate(ExecutionContext&) const
  14. {
  15. Value ret(SQLType::Float);
  16. ret = value();
  17. return ret;
  18. }
  19. Value StringLiteral::evaluate(ExecutionContext&) const
  20. {
  21. Value ret(SQLType::Text);
  22. ret = value();
  23. return ret;
  24. }
  25. Value NullLiteral::evaluate(ExecutionContext&) const
  26. {
  27. return Value::null();
  28. }
  29. Value NestedExpression::evaluate(ExecutionContext& context) const
  30. {
  31. return expression()->evaluate(context);
  32. }
  33. Value ChainedExpression::evaluate(ExecutionContext& context) const
  34. {
  35. Value ret(SQLType::Tuple);
  36. Vector<Value> values;
  37. for (auto& expression : expressions()) {
  38. values.append(expression.evaluate(context));
  39. }
  40. ret = values;
  41. return ret;
  42. }
  43. Value UnaryOperatorExpression::evaluate(ExecutionContext& context) const
  44. {
  45. Value expression_value = NestedExpression::evaluate(context);
  46. switch (type()) {
  47. case UnaryOperator::Plus:
  48. if (expression_value.type() == SQLType::Integer || expression_value.type() == SQLType::Float)
  49. return expression_value;
  50. // TODO: Error handling.
  51. VERIFY_NOT_REACHED();
  52. case UnaryOperator::Minus:
  53. if (expression_value.type() == SQLType::Integer) {
  54. expression_value = -int(expression_value);
  55. return expression_value;
  56. }
  57. if (expression_value.type() == SQLType::Float) {
  58. expression_value = -double(expression_value);
  59. return expression_value;
  60. }
  61. // TODO: Error handling.
  62. VERIFY_NOT_REACHED();
  63. case UnaryOperator::Not:
  64. if (expression_value.type() == SQLType::Boolean) {
  65. expression_value = !bool(expression_value);
  66. return expression_value;
  67. }
  68. // TODO: Error handling.
  69. VERIFY_NOT_REACHED();
  70. case UnaryOperator::BitwiseNot:
  71. if (expression_value.type() == SQLType::Integer) {
  72. expression_value = ~u32(expression_value);
  73. return expression_value;
  74. }
  75. // TODO: Error handling.
  76. VERIFY_NOT_REACHED();
  77. }
  78. VERIFY_NOT_REACHED();
  79. }
  80. }