Add error checking for PostgreSQLStatement::execute method. (#5121)

This commit is contained in:
她和她的猫 2022-10-11 10:37:54 +08:00 committed by GitHub
parent c2a4b587c4
commit 677c9da9bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 107 additions and 4 deletions

View File

@ -27,6 +27,7 @@ jobs:
env:
SW_VERSION: ${{ matrix.sw-version }}
MYSQL_VERSION: '5.7'
PGSQL_VERSION: '14'
steps:
- name: Checkout
uses: actions/checkout@v2
@ -48,7 +49,7 @@ jobs:
rm swoole.tar.gz
cd swoole
phpize
if [ _${{ matrix.sw-version }} = '_v5.0.0' ] || [ _${{ matrix.sw-version }} = '_master']
if [ _${{ matrix.sw-version }} = '_v5.0.0' ] || [ _${{ matrix.sw-version }} = '_master' ]
then
./configure --enable-openssl --enable-swoole-curl --enable-cares --enable-swoole-pgsql
else
@ -64,6 +65,7 @@ jobs:
- name: Setup Services
run: |
docker run --name mysql -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true -d mysql:${MYSQL_VERSION} --bind-address=0.0.0.0 --default-authentication-plugin=mysql_native_password
docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=postgres -d postgres:${PGSQL_VERSION}
docker run --name redis -p 6379:6379 -d redis
docker run -d --name dev-consul -e CONSUL_BIND_INTERFACE=eth0 -p 8500:8500 consul
docker run --name nsq -p 4150:4150 -p 4151:4151 -p 4160:4160 -p 4161:4161 -p 4170:4170 -p 4171:4171 --entrypoint /bin/nsqd -d nsqio/nsq:latest
@ -76,6 +78,8 @@ jobs:
docker run -d --name tcp-server -p 10001:10001 tcp-server:latest
- name: Setup Mysql
run: export TRAVIS_BUILD_DIR=$(pwd) && bash ./.travis/setup.mysql.sh
- name: Setup PostgreSQL
run: export TRAVIS_BUILD_DIR=$(pwd) && bash ./.travis/setup.pgsql.sh
- name: Run Scripts Before Test
run: cp .travis/.env.example .env
- name: Run Test Cases

12
.travis/pgsql.sql Normal file
View File

@ -0,0 +1,12 @@
CREATE TABLE users
(
id SERIAL
constraint users_id
primary key,
email varchar(255) not null
constraint users_email
unique,
name varchar(255) not null
);
INSERT INTO public.users (id, email, name) VALUES (DEFAULT, 'test@hyperf.io', 'hyperf');

15
.travis/setup.pgsql.sh Executable file
View File

@ -0,0 +1,15 @@
#!/usr/bin/env bash
CURRENT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
TRAVIS_BUILD_DIR="${TRAVIS_BUILD_DIR:-$(dirname $(dirname $CURRENT_DIR))}"
echo -e "Init PostgreSQL database..."
echo "127.0.0.1:5432:postgres:postgres:postgres" > ~/.pgpass
chmod 600 ~/.pgpass
psql -h 127.0.0.1 -p 5432 -d postgres -U postgres -f .travis/pgsql.sql
echo -e "Done\n"
wait

View File

@ -159,3 +159,4 @@ composer analyse
- [#4920](https://github.com/hyperf/hyperf/pull/4920) Fixed bug that the routing path is wrong (like `//foo`) when the routing prefix is end of '/'.
- [#4940](https://github.com/hyperf/hyperf/pull/4940) Fixed memory leak caused by an exception which occurred in `Parallel`.
- [#5100](https://github.com/hyperf/hyperf/pull/5100) Fixed bug that the tag `continue` cannot work when using `view-engine`.
- [#5121](https://github.com/hyperf/hyperf/pull/5121) Fixed bug that the SQL is not valid but the correct error message cannot be obtained when using `pgsql`.

View File

@ -102,7 +102,7 @@
## 文档生成
- [hyperf/swagger](https://github.com/hyperf/swagger) Hyperf 官方提供的 Swagger 文档自动生成组件 (beta)
- [tangwei/swagger](https://github.com/tw2066/api-docs) 一个基于PHP类型(DTO)自动生成swagger文档组件启动自动扫描、自动生成路由(UI)、注解验证
- [tangwei/swagger](https://github.com/tw2066/api-docs) 一个基于 PHP 类型(DTO)自动生成 swagger 文档组件,启动自动扫描、自动生成路由(UI)、注解验证
## Graphql

View File

@ -4,7 +4,7 @@
| 版本 | 状态 | 积极支持截止时间 | 安全维护截止时间 | 发布或预计发布时间 |
| ---- |--------|------------|------------|------------|
| 3.0 | 研发中 (RC1已发布) | 2023-06-20 | 2023-12-31 | 2022-08-30~2022-09-30 |
| 3.0 | 研发中 (RC1 已发布) | 2023-06-20 | 2023-12-31 | 2022-08-30~2022-09-30 |
| 2.2 | 积极支持中 | 2022-06-20 | 2022-12-31 | 2021-07-19 |
| 2.1 | 停止维护 | 2021-06-30 | 2021-12-31 | 2020-12-28 |
| 2.0 | 停止维护 | 2020-12-28 | 2021-06-30 | 2020-06-22 |

View File

@ -106,7 +106,7 @@ class PostgreSqlSwooleExtConnection extends Connection
$result = $statement->execute($this->prepareBindings($bindings));
if ($result === false) {
if ($result === false || ! empty($this->pdo->error)) {
throw new QueryException($query, [], new \Exception($this->pdo->error));
}

View File

@ -0,0 +1,71 @@
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace HyperfTest\Database\PgSQL\Cases;
use Hyperf\Database\Connection;
use Hyperf\Database\Connectors\ConnectionFactory;
use Hyperf\Database\Exception\QueryException;
use Hyperf\Database\PgSQL\Connectors\PostgresSqlSwooleExtConnector;
use Hyperf\Database\PgSQL\PostgreSqlSwooleExtConnection;
use Hyperf\Database\Query\Builder;
use PHPUnit\Framework\TestCase;
use Psr\Container\ContainerInterface;
/**
* @internal
* @coversNothing
*/
class PostgreSqlSwooleExtConnectionTest extends TestCase
{
protected ConnectionFactory $connectionFactory;
public function setUp(): void
{
$container = \Mockery::mock(ContainerInterface::class);
$container->shouldReceive('has')->andReturn(true);
$container->shouldReceive('get')->with('db.connector.pgsql-swoole')->andReturn(new PostgresSqlSwooleExtConnector());
$this->connectionFactory = new ConnectionFactory($container);
Connection::resolverFor('pgsql-swoole', static function ($connection, $database, $prefix, $config) {
return new PostgreSqlSwooleExtConnection($connection, $database, $prefix, $config);
});
}
public function testSelectMethodDuplicateKeyValueException()
{
if (SWOOLE_MAJOR_VERSION < 5) {
$this->markTestSkipped('PostgreSql requires Swoole version >= 5.0.0');
}
$connection = $this->connectionFactory->make([
'driver' => 'pgsql-swoole',
'host' => '127.0.0.1',
'port' => 5432,
'database' => 'postgres',
'username' => 'postgres',
'password' => 'postgres',
]);
$builder = new Builder($connection);
$this->expectException(QueryException::class);
$this->expectExceptionMessage('ERROR: duplicate key value violates unique constraint "users_email"');
$id = $builder->from('users')->insertGetId(['email' => 'test@hyperf.io', 'name' => 'hyperf'], 'id');
$id2 = $builder->from('users')->insertGetId(['email' => 'test@hyperf.io', 'name' => 'hyperf'], 'id');
// Never here
$this->assertIsNumeric($id);
$this->assertIsNumeric($id2);
}
}