Issues (21)

src/SqlParser.php (5 issues)

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Db\Pgsql;
6
7
use Yiisoft\Db\Syntax\AbstractSqlParser;
0 ignored issues
show
The type Yiisoft\Db\Syntax\AbstractSqlParser was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
8
9
final class SqlParser extends AbstractSqlParser
10
{
11
    public function getNextPlaceholder(int|null &$position = null): string|null
12
    {
13
        $result = null;
14
        $length = $this->length - 1;
15
16
        while ($this->position < $length) {
17
            $pos = $this->position++;
18
19
            match ($this->sql[$pos]) {
20
                ':' => ($word = $this->parseWord()) === ''
21
                    ? $this->skipChars(':')
22
                    : $result = ':' . $word,
23
                '"', "'" => $this->skipQuotedWithoutEscape($this->sql[$pos]),
24
                'e', 'E' => $this->sql[$this->position] === "'"
25
                    ? ++$this->position && $this->skipQuotedWithEscape("'")
26
                    : $this->skipIdentifier(),
0 ignored issues
show
Are you sure the usage of $this->skipIdentifier() targeting Yiisoft\Db\Pgsql\SqlParser::skipIdentifier() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
27
                '$' => $this->skipQuotedWithDollar(),
0 ignored issues
show
Are you sure the usage of $this->skipQuotedWithDollar() targeting Yiisoft\Db\Pgsql\SqlParser::skipQuotedWithDollar() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
28
                '-' => $this->sql[$this->position] === '-'
29
                    ? ++$this->position && $this->skipToAfterChar("\n")
30
                    : null,
31
                '/' => $this->sql[$this->position] === '*'
32
                    ? ++$this->position && $this->skipToAfterString('*/')
33
                    : null,
34
                // Identifiers can contain dollar sign which can be used for quoting. Skip them.
35
                '_','a', 'b', 'c', 'd', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
36
                'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
37
                'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' => $this->skipIdentifier(),
0 ignored issues
show
Are you sure the usage of $this->skipIdentifier() targeting Yiisoft\Db\Pgsql\SqlParser::skipIdentifier() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
38
                default => null,
39
            };
40
41
            if ($result !== null) {
42
                $position = $pos;
43
44
                return $result;
45
            }
46
        }
47
48
        return null;
49
    }
50
51
    /**
52
     * Skips dollar-quoted string.
53
     */
54
    private function skipQuotedWithDollar(): void
55
    {
56
        $pos = $this->position;
57
        $identifier = $this->parseIdentifier();
58
59
        if ($this->sql[$this->position] !== '$') {
60
            $this->position = $pos;
0 ignored issues
show
Bug Best Practice introduced by
The property position does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
61
            return;
62
        }
63
64
        ++$this->position;
65
66
        $this->skipToAfterString('$' . $identifier . '$');
67
    }
68
69
    /**
70
     * Skips an identifier. Equals to `[$\w]+` in regular expressions.
71
     */
72
    private function skipIdentifier(): void
73
    {
74
        $continue = true;
75
76
        while ($continue && $this->position < $this->length) {
77
            match ($this->sql[$this->position]) {
78
                '$', '_', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
79
                'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
80
                'v', 'w', 'x', 'y', 'z',
81
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
82
                'V', 'W', 'X', 'Y', 'Z' => ++$this->position,
83
                default => $continue = false,
84
            };
85
        }
86
    }
87
}
88