sql compare lhs must be col

This commit is contained in:
2021-04-08 19:48:04 +02:00
parent 1812b87fb4
commit c863a9083e
6 changed files with 44 additions and 21 deletions

View File

@@ -5,16 +5,16 @@ namespace Driver\SQL\Condition;
class Compare extends Condition {
private string $operator;
private $lhs;
private string $column;
private $value;
public function __construct($col, $val, string $operator = '=') {
public function __construct(string $col, $val, string $operator = '=') {
$this->operator = $operator;
$this->lhs = $col;
$this->column = $col;
$this->value = $val;
}
public function getLHS() { return $this->lhs; }
public function getColumn(): string { return $this->column; }
public function getValue() { return $this->value; }
public function getOperator(): string { return $this->operator; }

View File

@@ -0,0 +1,23 @@
<?php
namespace Driver\SQL\Expression;
use Driver\SQL\SQL;
class DateSub extends Expression {
private Expression $lhs;
private Expression $rhs;
private string $unit;
public function __construct(Expression $lhs, Expression $rhs, string $unit) {
$this->lhs = $lhs;
$this->rhs = $rhs;
$this->unit = $unit;
}
public function getLHS(): Expression { return $this->lhs; }
public function getRHS(): Expression { return $this->rhs; }
public function getUnit(): string { return $this->unit; }
}

View File

@@ -18,6 +18,7 @@ use Driver\SQL\Condition\CondRegex;
use Driver\SQL\Expression\Add;
use Driver\SQL\Expression\CurrentTimeStamp;
use Driver\SQL\Expression\DateAdd;
use Driver\SQL\Expression\DateSub;
use Driver\SQL\Expression\Expression;
use Driver\SQL\Query\CreateProcedure;
use Driver\SQL\Query\CreateTrigger;
@@ -195,7 +196,7 @@ class MySQL extends SQL {
$columnName = $this->columnName($value->getName());
$updateValues[] = "$leftColumn=VALUES($columnName)";
} else if($value instanceof Add) {
$columnName = $this->columnName($value->getLHS());
$columnName = $this->columnName($value->getColumn());
$operator = $value->getOperator();
$value = $value->getValue();
$updateValues[] = "$leftColumn=$columnName$operator" . $this->addValue($value, $params);
@@ -403,11 +404,12 @@ class MySQL extends SQL {
}
protected function createExpression(Expression $exp, array &$params) {
if ($exp instanceof DateAdd) {
if ($exp instanceof DateAdd || $exp instanceof DateSub) {
$lhs = $this->addValue($exp->getLHS(), $params);
$rhs = $this->addValue($exp->getRHS(), $params);
$unit = $exp->getUnit();
return "DATE_ADD($lhs, INTERVAL $rhs $unit)";
$dateFunction = ($exp instanceof DateAdd ? "DATE_ADD" : "DATE_SUB");
return "$dateFunction($lhs, INTERVAL $rhs $unit)";
} else if ($exp instanceof CurrentTimeStamp) {
return "NOW()";
} else {

View File

@@ -18,6 +18,7 @@ use Driver\SQL\Condition\CondRegex;
use Driver\SQL\Expression\Add;
use Driver\SQL\Expression\CurrentTimeStamp;
use Driver\SQL\Expression\DateAdd;
use Driver\SQL\Expression\DateSub;
use Driver\SQL\Expression\Expression;
use Driver\SQL\Query\CreateProcedure;
use Driver\SQL\Query\CreateTrigger;
@@ -155,7 +156,7 @@ class PostgreSQL extends SQL {
$columnName = $this->columnName($value->getName());
$updateValues[] = "$leftColumn=EXCLUDED.$columnName";
} else if ($value instanceof Add) {
$columnName = $this->columnName($value->getLHS());
$columnName = $this->columnName($value->getColumn());
$operator = $value->getOperator();
$value = $value->getValue();
$updateValues[] = "$leftColumn=$columnName$operator" . $this->addValue($value, $params);
@@ -419,7 +420,7 @@ class PostgreSQL extends SQL {
}
protected function createExpression(Expression $exp, array &$params) {
if ($exp instanceof DateAdd) {
if ($exp instanceof DateAdd || $exp instanceof DateSub) {
$lhs = $this->addValue($exp->getLHS(), $params);
$rhs = $this->addValue($exp->getRHS(), $params);
$unit = $exp->getUnit();
@@ -430,7 +431,8 @@ class PostgreSQL extends SQL {
$rhs = "$rhs $unit";
}
return "$lhs + $rhs";
$operator = ($exp instanceof DateAdd ? "+" : "-");
return "$lhs $operator $rhs";
} else if ($exp instanceof CurrentTimeStamp) {
return "CURRENT_TIMESTAMP";
} else {

View File

@@ -16,7 +16,6 @@ use \Driver\SQL\Constraint\Unique;
use \Driver\SQL\Constraint\PrimaryKey;
use \Driver\SQL\Constraint\ForeignKey;
use Driver\SQL\Expression\CurrentTimeStamp;
use Driver\SQL\Expression\DateAdd;
use Driver\SQL\Expression\Expression;
use Driver\SQL\Query\AlterTable;
use Driver\SQL\Query\CreateProcedure;
@@ -246,23 +245,19 @@ abstract class SQL {
}
return "(" . implode(" OR ", $conditions) . ")";
} else if ($condition instanceof Compare) {
$lhs = $condition->getLHS();
$lhs = ($lhs instanceof Expression ?
$this->createExpression($lhs, $params) :
$this->columnName($lhs));
$column = $this->columnName($condition->getColumn());
$value = $condition->getValue();
$operator = $condition->getOperator();
if ($value === null) {
if ($operator === "=") {
return "$lhs IS NULL";
return "$column IS NULL";
} else if ($operator === "!=") {
return "$lhs IS NOT NULL";
return "$column IS NOT NULL";
}
}
return $lhs . $operator . $this->addValue($value, $params);
return $column . $operator . $this->addValue($value, $params);
} else if ($condition instanceof CondBool) {
return $this->columnName($condition->getValue());
} else if (is_array($condition)) {