diff options
author | andrewnester <andrew.nester.dev@gmail.com> | 2017-03-10 20:34:23 +0300 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2017-03-12 17:03:00 +0100 |
commit | fbf0e0587f8455525466e6d4ab2c1f0fc24bfe26 (patch) | |
tree | 3ea45878bb00cfba6a9fd4ef1781f80f7df24c6d /ext/pdo_sqlite | |
parent | 280e8dafe472e6789fdcfebd3dade4c0705b0134 (diff) | |
download | php-git-fbf0e0587f8455525466e6d4ab2c1f0fc24bfe26.tar.gz |
Implement FR #74217: deterministic sqlite functions
Diffstat (limited to 'ext/pdo_sqlite')
-rw-r--r-- | ext/pdo_sqlite/pdo_sqlite.c | 2 | ||||
-rw-r--r-- | ext/pdo_sqlite/sqlite_driver.c | 9 | ||||
-rw-r--r-- | ext/pdo_sqlite/tests/pdo_sqlite_createfunction_with_flags.phpt | 38 |
3 files changed, 45 insertions, 4 deletions
diff --git a/ext/pdo_sqlite/pdo_sqlite.c b/ext/pdo_sqlite/pdo_sqlite.c index c5bba02d07..621123b39a 100644 --- a/ext/pdo_sqlite/pdo_sqlite.c +++ b/ext/pdo_sqlite/pdo_sqlite.c @@ -69,6 +69,8 @@ ZEND_GET_MODULE(pdo_sqlite) /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(pdo_sqlite) { + REGISTER_PDO_CLASS_CONST_LONG("SQLITE_DETERMINISTIC", (zend_long)SQLITE_DETERMINISTIC); + return php_pdo_register_driver(&pdo_sqlite_driver); } /* }}} */ diff --git a/ext/pdo_sqlite/sqlite_driver.c b/ext/pdo_sqlite/sqlite_driver.c index 3f9b51d121..71bac8580a 100644 --- a/ext/pdo_sqlite/sqlite_driver.c +++ b/ext/pdo_sqlite/sqlite_driver.c @@ -505,7 +505,7 @@ static int php_sqlite3_collation_callback(void *context, return ret; } -/* {{{ bool SQLite::sqliteCreateFunction(string name, mixed callback [, int argcount]) +/* {{{ bool SQLite::sqliteCreateFunction(string name, mixed callback [, int argcount, int flags]) Registers a UDF with the sqlite db handle */ static PHP_METHOD(SQLite, sqliteCreateFunction) { @@ -514,13 +514,14 @@ static PHP_METHOD(SQLite, sqliteCreateFunction) char *func_name; size_t func_name_len; zend_long argc = -1; + zend_long flags = 0; zend_string *cbname = NULL; pdo_dbh_t *dbh; pdo_sqlite_db_handle *H; int ret; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "sz|l", - &func_name, &func_name_len, &callback, &argc)) { + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "sz|ll", + &func_name, &func_name_len, &callback, &argc, &flags)) { RETURN_FALSE; } @@ -538,7 +539,7 @@ static PHP_METHOD(SQLite, sqliteCreateFunction) func = (struct pdo_sqlite_func*)ecalloc(1, sizeof(*func)); - ret = sqlite3_create_function(H->db, func_name, argc, SQLITE_UTF8, + ret = sqlite3_create_function(H->db, func_name, argc, flags | SQLITE_UTF8, func, php_sqlite3_func_callback, NULL, NULL); if (ret == SQLITE_OK) { func->funcname = estrdup(func_name); diff --git a/ext/pdo_sqlite/tests/pdo_sqlite_createfunction_with_flags.phpt b/ext/pdo_sqlite/tests/pdo_sqlite_createfunction_with_flags.phpt new file mode 100644 index 0000000000..4f0b6754a1 --- /dev/null +++ b/ext/pdo_sqlite/tests/pdo_sqlite_createfunction_with_flags.phpt @@ -0,0 +1,38 @@ +--TEST-- +PDO_sqlite: Testing sqliteCreateFunction() with flags +--SKIPIF-- +<?php if (!extension_loaded('pdo_sqlite')) print 'skip not loaded'; ?> +--FILE-- +<?php + +$db = new pdo('sqlite::memory:'); + +$db->query('CREATE TABLE IF NOT EXISTS foobar (id INT AUTO INCREMENT, name TEXT)'); + +$db->query('INSERT INTO foobar VALUES (NULL, "PHP")'); +$db->query('INSERT INTO foobar VALUES (NULL, "PHP6")'); + + +$db->sqliteCreateFunction('testing', function($v) { return strtolower($v); }, 1, PDO::SQLITE_DETERMINISTIC); + + +foreach ($db->query('SELECT testing(name) FROM foobar') as $row) { + var_dump($row); +} + +$db->query('DROP TABLE foobar'); + +?> +--EXPECTF-- +array(2) { + ["testing(name)"]=> + string(3) "php" + [0]=> + string(3) "php" +} +array(2) { + ["testing(name)"]=> + string(4) "php6" + [0]=> + string(4) "php6" +} |