/
home
/
sjslayjy
/
public_html
/
devlok
/
vendor
/
laravel
/
framework
/
src
/
Illuminate
/
Database
/
Query
/
Grammars
/
Upload File
HOME
<?php namespace Illuminate\Database\Query\Grammars; use Illuminate\Support\Arr; use Illuminate\Support\Str; use Illuminate\Database\Query\Builder; class SQLiteGrammar extends Grammar { /** * The components that make up a select clause. * * @var array */ protected $selectComponents = [ 'aggregate', 'columns', 'from', 'joins', 'wheres', 'groups', 'havings', 'orders', 'limit', 'offset', 'lock', ]; /** * All of the available clause operators. * * @var array */ protected $operators = [ '=', '<', '>', '<=', '>=', '<>', '!=', 'like', 'not like', 'ilike', '&', '|', '<<', '>>', ]; /** * Compile a select query into SQL. * * @param \Illuminate\Database\Query\Builder $query * @return string */ public function compileSelect(Builder $query) { if ($query->unions && $query->aggregate) { return $this->compileUnionAggregate($query); } $sql = parent::compileSelect($query); if ($query->unions) { $sql = 'select * from ('.$sql.') '.$this->compileUnions($query); } return $sql; } /** * Compile a single union statement. * * @param array $union * @return string */ protected function compileUnion(array $union) { $conjunction = $union['all'] ? ' union all ' : ' union '; return $conjunction.'select * from ('.$union['query']->toSql().')'; } /** * Compile a "where date" clause. * * @param \Illuminate\Database\Query\Builder $query * @param array $where * @return string */ protected function whereDate(Builder $query, $where) { return $this->dateBasedWhere('%Y-%m-%d', $query, $where); } /** * Compile a "where day" clause. * * @param \Illuminate\Database\Query\Builder $query * @param array $where * @return string */ protected function whereDay(Builder $query, $where) { return $this->dateBasedWhere('%d', $query, $where); } /** * Compile a "where month" clause. * * @param \Illuminate\Database\Query\Builder $query * @param array $where * @return string */ protected function whereMonth(Builder $query, $where) { return $this->dateBasedWhere('%m', $query, $where); } /** * Compile a "where year" clause. * * @param \Illuminate\Database\Query\Builder $query * @param array $where * @return string */ protected function whereYear(Builder $query, $where) { return $this->dateBasedWhere('%Y', $query, $where); } /** * Compile a "where time" clause. * * @param \Illuminate\Database\Query\Builder $query * @param array $where * @return string */ protected function whereTime(Builder $query, $where) { return $this->dateBasedWhere('%H:%M:%S', $query, $where); } /** * Compile a date based where clause. * * @param string $type * @param \Illuminate\Database\Query\Builder $query * @param array $where * @return string */ protected function dateBasedWhere($type, Builder $query, $where) { $value = $this->parameter($where['value']); return "strftime('{$type}', {$this->wrap($where['column'])}) {$where['operator']} cast({$value} as text)"; } /** * Compile a "JSON length" statement into SQL. * * @param string $column * @param string $operator * @param string $value * @return string */ protected function compileJsonLength($column, $operator, $value) { [$field, $path] = $this->wrapJsonFieldAndPath($column); return 'json_array_length('.$field.$path.') '.$operator.' '.$value; } /** * Compile an insert statement into SQL. * * @param \Illuminate\Database\Query\Builder $query * @param array $values * @return string */ public function compileInsert(Builder $query, array $values) { $table = $this->wrapTable($query->from); return empty($values) ? "insert into {$table} DEFAULT VALUES" : parent::compileInsert($query, $values); } /** * Compile an insert ignore statement into SQL. * * @param \Illuminate\Database\Query\Builder $query * @param array $values * @return string */ public function compileInsertOrIgnore(Builder $query, array $values) { return Str::replaceFirst('insert', 'insert or ignore', $this->compileInsert($query, $values)); } /** * Compile an update statement into SQL. * * @param \Illuminate\Database\Query\Builder $query * @param array $values * @return string */ public function compileUpdate(Builder $query, $values) { $table = $this->wrapTable($query->from); $columns = collect($values)->map(function ($value, $key) { return $this->wrap(Str::after($key, '.')).' = '.$this->parameter($value); })->implode(', '); if (isset($query->joins) || isset($query->limit)) { return $this->compileUpdateWithJoinsOrLimit($query, $columns); } return trim("update {$table} set {$columns} {$this->compileWheres($query)}"); } /** * Compile an update statement with joins or limit into SQL. * * @param \Illuminate\Database\Query\Builder $query * @param string $columns * @return string */ protected function compileUpdateWithJoinsOrLimit(Builder $query, $columns) { $segments = preg_split('/\s+as\s+/i', $query->from); $alias = $segments[1] ?? $segments[0]; $selectSql = parent::compileSelect($query->select($alias.'.rowid')); return "update {$this->wrapTable($query->from)} set {$columns} where {$this->wrap('rowid')} in ({$selectSql})"; } /** * Prepare the bindings for an update statement. * * @param array $bindings * @param array $values * @return array */ public function prepareBindingsForUpdate(array $bindings, array $values) { $cleanBindings = Arr::except($bindings, 'select'); return array_values( array_merge($values, Arr::flatten($cleanBindings)) ); } /** * Compile a delete statement into SQL. * * @param \Illuminate\Database\Query\Builder $query * @return string */ public function compileDelete(Builder $query) { if (isset($query->joins) || isset($query->limit)) { return $this->compileDeleteWithJoinsOrLimit($query); } $wheres = is_array($query->wheres) ? $this->compileWheres($query) : ''; return trim("delete from {$this->wrapTable($query->from)} $wheres"); } /** * Compile a delete statement with joins or limit into SQL. * * @param \Illuminate\Database\Query\Builder $query * @return string */ protected function compileDeleteWithJoinsOrLimit(Builder $query) { $segments = preg_split('/\s+as\s+/i', $query->from); $alias = $segments[1] ?? $segments[0]; $selectSql = parent::compileSelect($query->select($alias.'.rowid')); return "delete from {$this->wrapTable($query->from)} where {$this->wrap('rowid')} in ({$selectSql})"; } /** * Compile a truncate table statement into SQL. * * @param \Illuminate\Database\Query\Builder $query * @return array */ public function compileTruncate(Builder $query) { return [ 'delete from sqlite_sequence where name = ?' => [$query->from], 'delete from '.$this->wrapTable($query->from) => [], ]; } /** * Wrap the given JSON selector. * * @param string $value * @return string */ protected function wrapJsonSelector($value) { [$field, $path] = $this->wrapJsonFieldAndPath($value); return 'json_extract('.$field.$path.')'; } }