test.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. <?php
  2. $_ = [
  3. 'TESTDB_CONNECTION_ERROR' => 0xFFF,
  4. 'TABLEEXISTS_NOT_FALSE' => 0x100,
  5. 'TABLEEXISTS_NOT_TRUE' => 0x101,
  6. 'GET_QUERY_MISMATCH' => 0x200,
  7. 'GET_RETURNING_WRONG_DATA' => 0x201,
  8. 'GET_QUERY_LIMIT_MISMATCH' => 0x202,
  9. 'GET_QUERY_ARRAY_LIMIT_MISMATCH' => 0x203,
  10. 'GET_RETURN_MISSING_RESULT' => 0x204,
  11. 'GET_RETURN_TOO_MANY_RESULT' => 0x205,
  12. 'GET_RETURN_WRONG_RESULT_TYPE_STRING' => 0x206,
  13. 'GET_RETURN_WRONG_RESULT_TYPE_INT' => 0x207,
  14. 'INSERT_QUERY_MISMATCH' => 0x300,
  15. 'INSERT_RETURN_WRONG_DATA' => 0x301,
  16. 'INSERT_RETURN_WRONG_DATA_TYPE_INT' => 0x302,
  17. 'INSERT_RETURN_WRONG_DATA_TYPE_STRING' => 0x303,
  18. 'INSERT_DUPE_PRIMARY_KEY_WRONG_ERROR_MSG' => 0x304,
  19. 'INSERT_RETURN_WRONG_DATA_TYPE_ARRAY' => 0x305,
  20. 'GETONE_QUERY_MISMATCH' => 0x400,
  21. 'GETONE_RETURNING_WRONG_STRUCTURE' => 0x401,
  22. 'GETONE_RETURNING_WRONG_DATA' => 0x402,
  23. 'GETONE_QUERY_COLUMN_MISMATCH' => 0x403,
  24. 'GETONE_RETURNING_WRONG_DATA_TYPE_INT' => 0x402,
  25. 'GETONE_RETURNING_WRONG_DATA_TYPE_STRING' => 0x402,
  26. 'GETONE_RETURNING_COLUMN_WRONG_DATA' => 0x403,
  27. 'WHERE_QUERY_MISMATCH' => 0x500,
  28. 'WHERE_RETURNING_WRONG_DATA' => 0x501,
  29. 'WHERE_QUERY_LITERAL_MISMATCH' => 0x502,
  30. 'WHERE_QUERY_ARRAY_MISMATCH' => 0x503,
  31. 'WHERE_RETURNING_WRONG_DATA_TYPE_INT' => 0x504,
  32. 'WHERE_RETURNING_WRONG_DATA_TYPE_STRING' => 0x505,
  33. 'WHERE_QUERY_BETWEEN_ARRAY_MISMATCH' => 0x506,
  34. 'WHERE_QUERY_NULL_MISMATCH' => 0x507,
  35. 'ORDERBY_QUERY_MISMATCH' => 0x600,
  36. 'ORDERBY_RETURNING_WRONG_DATA' => 0x601,
  37. 'ORDERBY_RETURNING_WRONG_DATA_TYPE_INT' => 0x602,
  38. 'ORDERBY_RETURNING_WRONG_DATA_TYPE_STRING' => 0x603,
  39. 'QUERY_QUERY_MISMATCH' => 0x700,
  40. 'QUERY_RETURNING_WRONG_DATA' => 0x701,
  41. 'QUERY_ARRAY_QUERY_MISMATCH' => 0x702,
  42. 'QUERY_ARRAY_RETURNING_WRONG_DATA' => 0x703,
  43. 'COUNT_QUERY_MISMATCH' => 0x800,
  44. 'COUNT_RETURNING_WRONG_DATA_TYPE' => 0x801,
  45. 'COUNT_RETURNING_WRONG_DATA' => 0x802,
  46. 'HAS_RETURNING_WRONG_DATA_TYPE' => 0x900,
  47. 'HAS_RETURNING_WRONG_DATA' => 0x901,
  48. 'DELETE_WHERE_NOT_DELETING' => 0xA00,
  49. 'DELETE_WHERE_DELETING_WRONG_ROWS' => 0xA01,
  50. 'DELETE_NOT_DELETING' => 0xA02,
  51. 'DELETE_QUERY_MISMATCH' => 0xA03,
  52. 'DELETE_RETURNING_WRONG_DATA' => 0xA04,
  53. 'DELETE_RETURNING_WRONG_DATA_TYPE_STRING' => 0xA05,
  54. 'JOIN_QUERY_MISMATCH' => 0xB00,
  55. 'JOIN_QUERY_ALIAS_MISMATCH' => 0xB01,
  56. 'PDO_ERRMODE_UNCHANGED_PRECONN' => 0xC00,
  57. 'PDO_ERRMODE_UNCHANGED_POSTCONN' => 0xC01,
  58. 'GROUPBY_QUERY_MISMATCH' => 0xD00,
  59. 'GROUPBY_RETURNING_WRONG_DATA' => 0xD01,
  60. 'STRING_MISMATCH' => 0xFFF,
  61. ];
  62. function fail($exit_key)
  63. {
  64. global $_;
  65. if (!isset($_[$exit_key])) {
  66. throw new RuntimeException("FAILURE: $exit_key (invalid exit code)");
  67. }
  68. $RawExitCode = $_[$exit_key];
  69. $ExitCode = '0x' . strtoupper(dechex($RawExitCode));
  70. throw new RuntimeException("FAILURE: $exit_key ($ExitCode)\n");
  71. }
  72. function expect($generated, $expect, $exit_key = 'STRING_MISMATCH')
  73. {
  74. if ($expect !== $generated) {
  75. echo "Mismatched string\nExpected: ", var_export($expect, true), "\n Got: ", var_export($generated, true), "\n";
  76. fail($exit_key);
  77. }
  78. }
  79. require __DIR__ . '/src/PostgresDb.php';
  80. use \SeinopSys\PostgresDb;
  81. # replacePlaceHolders() checks
  82. expect(
  83. PostgresDb::replacePlaceHolders('SELECT * FROM users WHERE id = ? AND name = ?', [1, 'John']),
  84. "SELECT * FROM users WHERE id = 1 AND name = 'John'"
  85. );
  86. expect(
  87. PostgresDb::replacePlaceHolders('SELECT * FROM users WHERE id = :id AND name = :un', [':id' => 1, ':un' => 'John']),
  88. "SELECT * FROM users WHERE id = 1 AND name = 'John'"
  89. );
  90. expect(
  91. PostgresDb::replacePlaceHolders('SELECT * FROM users WHERE id = :id AND name = ?', [':id' => 1, 'John']),
  92. "SELECT * FROM users WHERE id = 1 AND name = 'John'"
  93. );
  94. expect(
  95. PostgresDb::replacePlaceHolders('SELECT * FROM users WHERE id = :id AND name = ? AND role = ? AND password IS :pw', [':id' => 1, 'John', ':pw' => null, 'admin']),
  96. "SELECT * FROM users WHERE id = 1 AND name = 'John' AND role = 'admin' AND password IS NULL"
  97. );
  98. expect(
  99. PostgresDb::replacePlaceHolders('SELECT * FROM users WHERE id = :id AND name = ? AND role = ? AND password IS :pw', ['id' => 1, 'John', 'pw' => null, 'admin']),
  100. "SELECT * FROM users WHERE id = 1 AND name = 'John' AND role = 'admin' AND password IS NULL"
  101. );
  102. $db = new PostgresDb('test', 'localhost', 'postgres', '');
  103. function checkQuery($expect, $exit_key)
  104. {
  105. global $db;
  106. if ($db === null) {
  107. return false;
  108. }
  109. expect($db->getLastQuery(), $expect, $exit_key);
  110. }
  111. // Check tableExists & query
  112. try {
  113. $db->getConnection();
  114. } catch (Throwable $e) {
  115. var_dump($e);
  116. fail('TESTDB_CONNECTION_ERROR');
  117. }
  118. if ($db->tableExists('users') !== false) {
  119. fail('TABLEEXISTS_NOT_FALSE');
  120. }
  121. $db->query('CREATE TABLE "users" (id SERIAL NOT NULL, name CHARACTER VARYING(10), gender CHARACTER(1) NOT NULL)');
  122. if ($db->tableExists('users') !== true) {
  123. fail('TABLEEXISTS_NOT_TRUE');
  124. }
  125. // Add PRIMARY KEY constraint
  126. $db->query('ALTER TABLE "users" ADD CONSTRAINT "users_id" PRIMARY KEY ("id")');
  127. # get() Checks
  128. // Regular call
  129. $users = $db->get('users');
  130. checkQuery('SELECT * FROM "users"', 'GET_QUERY_MISMATCH');
  131. if (!is_array($users)) {
  132. var_dump($users);
  133. fail('GET_RETURNING_WRONG_DATA');
  134. }
  135. // Check get with limit
  136. $users = $db->get('users', 1);
  137. checkQuery('SELECT * FROM "users" LIMIT 1', 'GET_QUERY_LIMIT_MISMATCH');
  138. // Check get with array limit
  139. $users = $db->get('users', [10, 2]);
  140. checkQuery('SELECT * FROM "users" LIMIT 2 OFFSET 10', 'GET_QUERY_ARRAY_LIMIT_MISMATCH');
  141. // Check get with column(s)
  142. $users = $db->get('users', null, 'id');
  143. checkQuery('SELECT id FROM "users"', 'GET_QUERY_COLUMNS_MISMATCH');
  144. // Check get with complex column(s)
  145. $users = $db->get('users', null, "'ayy-'||id as happy_id");
  146. checkQuery("SELECT 'ayy-'||id AS happy_id FROM \"users\"", 'GET_QUERY_COLUMNS_MISMATCH');
  147. // Check get with column aliases
  148. $users = $db->get('users', null, 'id as user_id');
  149. checkQuery('SELECT id AS user_id FROM "users"', 'GET_QUERY_COLUMNS_MISMATCH');
  150. $users = $db->get('users', null, 'id as limit, name as from');
  151. checkQuery('SELECT id AS "limit", "name" AS "from" FROM "users"', 'GET_QUERY_COLUMNS_MISMATCH');
  152. # Check PDO error mode setting
  153. $db->setPDOErrmode(PDO::ERRMODE_EXCEPTION);
  154. $caught = false;
  155. try {
  156. // There's no email column so we should get an exception
  157. $db->getOne('users', 'email');
  158. } catch (PDOException $e) {
  159. $caught = true;
  160. }
  161. if (!$caught) {
  162. fail('PDO_ERRMODE_UNCHANGED_POSTCONN');
  163. }
  164. # count() Checks
  165. // Call
  166. $count = $db->count('users');
  167. checkQuery('SELECT COUNT(*) AS cnt FROM "users" LIMIT 1', 'COUNT_QUERY_MISMATCH');
  168. if (!is_int($count)) {
  169. fail('COUNT_RETURNING_WRONG_DATA_TYPE');
  170. }
  171. if ($count !== 0) {
  172. fail('COUNT_RETURNING_WRONG_DATA');
  173. }
  174. # has() Checks
  175. // Call
  176. $has = $db->has('users');
  177. if (!is_bool($has)) {
  178. fail('HAS_RETURNING_WRONG_DATA_TYPE');
  179. }
  180. if ($has !== false) {
  181. fail('HAS_RETURNING_WRONG_DATA');
  182. }
  183. # insert() Checks
  184. $return = $db->insert('users', ['name' => 'David', 'gender' => 'm']);
  185. checkQuery('INSERT INTO "users" ("name", gender) VALUES (\'David\', \'m\')', 'INSERT_QUERY_MISMATCH');
  186. if ($return !== true) {
  187. fail('INSERT_RETURN_WRONG_DATA');
  188. }
  189. # get() format checks
  190. $users = $db->get('users');
  191. if (!is_array($users)) {
  192. fail('GET_RETURNING_WRONG_DATA');
  193. }
  194. if (!isset($users[0])) {
  195. fail('GET_RETURN_MISSING_RESULT');
  196. }
  197. if (isset($users[1])) {
  198. fail('GET_RETURN_TOO_MANY_RESULT');
  199. }
  200. if (!is_string($users[0]['name'])) {
  201. fail('GET_RETURN_WRONG_RESULT_TYPE_STRING');
  202. }
  203. if (!is_int($users[0]['id'])) {
  204. fail('GET_RETURN_WRONG_RESULT_TYPE_INT');
  205. }
  206. // Check insert with returning integer
  207. $id = $db->insert('users', ['name' => 'Jon', 'gender' => 'm'], 'id');
  208. checkQuery('INSERT INTO "users" ("name", gender) VALUES (\'Jon\', \'m\') RETURNING id', 'INSERT_QUERY_MISMATCH');
  209. if (!is_int($id)) {
  210. fail('INSERT_RETURN_WRONG_DATA_TYPE_INT');
  211. }
  212. if ($id !== 2) {
  213. fail('INSERT_RETURN_WRONG_DATA');
  214. }
  215. // Check insert with returning string
  216. $name = $db->insert('users', ['name' => 'Anna', 'gender' => 'f'], 'name');
  217. checkQuery('INSERT INTO "users" ("name", gender) VALUES (\'Anna\', \'f\') RETURNING "name"', 'INSERT_QUERY_MISMATCH');
  218. if (!is_string($name)) {
  219. fail('INSERT_RETURN_WRONG_DATA_TYPE_STRING');
  220. }
  221. if ($name !== 'Anna') {
  222. fail('INSERT_RETURN_WRONG_DATA');
  223. }
  224. // Check insert with returning multiple columns
  225. $return = $db->insert('users', ['name' => 'Jason', 'gender' => 'm'], 'name, gender');
  226. checkQuery('INSERT INTO "users" ("name", gender) VALUES (\'Jason\', \'m\') RETURNING "name", gender', 'INSERT_QUERY_MISMATCH');
  227. if (!is_array($return)) {
  228. fail('INSERT_RETURN_WRONG_DATA_TYPE_ARRAY');
  229. }
  230. if ($return['name'] !== 'Jason' || $return['gender'] !== 'm') {
  231. fail('INSERT_RETURN_WRONG_DATA');
  232. }
  233. # where() Checks
  234. // Generic use
  235. $id1 = $db->where('id', 1)->get('users');
  236. checkQuery('SELECT * FROM "users" WHERE id = 1', 'WHERE_QUERY_MISMATCH');
  237. if (empty($id1) || !isset($id1[0]['id'])) {
  238. fail('WHERE_RETURNING_WRONG_DATA');
  239. }
  240. if ($id1[0]['id'] !== 1) {
  241. fail('WHERE_RETURNING_WRONG_DATA_TYPE_INT');
  242. }
  243. if ($id1[0]['name'] !== 'David') {
  244. fail('WHERE_RETURNING_WRONG_DATA_TYPE_STRING');
  245. }
  246. // Literal string check
  247. $id1 = $db->where('"id" = 1')->get('users');
  248. checkQuery('SELECT * FROM "users" WHERE "id" = 1', 'WHERE_QUERY_LITERAL_MISMATCH');
  249. if (empty($id1) || !isset($id1[0]['id']) || $id1[0]['id'] != 1) {
  250. fail('WHERE_RETURNING_WRONG_DATA');
  251. }
  252. if (!is_int($id1[0]['id'])) {
  253. fail('WHERE_RETURNING_WRONG_DATA_TYPE_INT');
  254. }
  255. // Null equality check
  256. $db->where('id', null)->get('users');
  257. checkQuery('SELECT * FROM "users" WHERE id IS NULL', 'WHERE_QUERY_NULL_MISMATCH');
  258. // Array check
  259. $id1 = $db->where('id', [1, 2])->orderBy('id')->get('users');
  260. checkQuery('SELECT * FROM "users" WHERE id IN (1, 2) ORDER BY id ASC', 'WHERE_QUERY_ARRAY_MISMATCH');
  261. if (empty($id1) || !isset($id1[0]['id'], $id1[1]['id']) || $id1[0]['id'] != 1 || $id1[1]['id'] != 2) {
  262. fail('WHERE_RETURNING_WRONG_DATA');
  263. }
  264. if (!is_int($id1[0]['id']) || !is_int($id1[1]['id'])) {
  265. fail('WHERE_RETURNING_WRONG_DATA_TYPE_INT');
  266. }
  267. $db->where('id', [1, 2], '!=')->orderBy('id')->get('users');
  268. checkQuery('SELECT * FROM "users" WHERE id NOT IN (1, 2) ORDER BY id ASC', 'WHERE_QUERY_ARRAY_MISMATCH');
  269. // Between array check
  270. $id1 = $db->where('id', [1, 2], 'BETWEEN')->orderBy('id')->get('users');
  271. checkQuery('SELECT * FROM "users" WHERE id BETWEEN 1 AND 2 ORDER BY id ASC', 'WHERE_QUERY_BETWEEN_ARRAY_MISMATCH');
  272. if (empty($id1) || !isset($id1[0]['id'], $id1[1]['id']) || $id1[0]['id'] != 1 || $id1[1]['id'] != 2) {
  273. fail('WHERE_RETURNING_WRONG_DATA');
  274. }
  275. if (!is_int($id1[0]['id']) || !is_int($id1[1]['id'])) {
  276. fail('WHERE_RETURNING_WRONG_DATA_TYPE_INT');
  277. }
  278. # getOne() Checks
  279. // Generic call
  280. $first_user = $db->where('id', 1)->getOne('users');
  281. checkQuery('SELECT * FROM "users" WHERE id = 1 LIMIT 1', 'GETONE_QUERY_MISMATCH');
  282. if (isset($first_user[0]) && is_array($first_user[0])) {
  283. fail('GETONE_RETURNING_WRONG_STRUCTURE');
  284. }
  285. if ($first_user['id'] != 1) {
  286. fail('GETONE_RETURNING_COLUMN_WRONG_DATA');
  287. }
  288. if (!is_int($first_user['id'])) {
  289. fail('GETONE_RETURNING_WRONG_DATA_TYPE_INT');
  290. }
  291. if (!is_string($first_user['name'])) {
  292. fail('GETONE_RETURNING_WRONG_DATA_TYPE_STRING');
  293. }
  294. // Columns
  295. $first_user = $db->where('id', 1)->getOne('users', 'id, name');
  296. checkQuery('SELECT id, "name" FROM "users" WHERE id = 1 LIMIT 1', 'GETONE_QUERY_COLUMN_MISMATCH');
  297. if ($first_user['id'] != 1) {
  298. fail('GETONE_RETURNING_COLUMN_WRONG_DATA');
  299. }
  300. if (!is_int($first_user['id'])) {
  301. fail('GETONE_RETURNING_WRONG_DATA_TYPE_INT');
  302. }
  303. if (!is_string($first_user['name'])) {
  304. fail('GETONE_RETURNING_WRONG_DATA_TYPE_STRING');
  305. }
  306. # orderBy() Checks
  307. // Generic call
  308. $last_user = $db->orderBy('id', 'DESC')->getOne('users');
  309. checkQuery('SELECT * FROM "users" ORDER BY id DESC LIMIT 1', 'ORDERBY_QUERY_MISMATCH');
  310. if (!isset($last_user['id'])) {
  311. fail('ORDERBY_RETURNING_WRONG_DATA');
  312. }
  313. if ($last_user['id'] != 4) {
  314. fail('ORDERBY_RETURNING_WRONG_DATA');
  315. }
  316. if (!is_int($last_user['id'])) {
  317. fail('ORDERBY_RETURNING_WRONG_DATA_TYPE_INT');
  318. }
  319. if (!is_string($last_user['name'])) {
  320. fail('ORDERBY_RETURNING_WRONG_DATA_TYPE_STRING');
  321. }
  322. # groupBy() Checks
  323. // Generic call
  324. $gender_count = $db->groupBy('gender')->orderBy('cnt', 'DESC')->get('users', null, 'gender, COUNT(*) as cnt');
  325. checkQuery('SELECT gender, COUNT(*) AS cnt FROM "users" GROUP BY gender ORDER BY cnt DESC', 'GROUPBY_QUERY_MISMATCH');
  326. if (!isset($gender_count[0]['cnt'], $gender_count[1]['cnt'], $gender_count[0]['gender'], $gender_count[1]['gender'])) {
  327. fail('GROUPBY_RETURNING_WRONG_DATA');
  328. }
  329. if ($gender_count[0]['cnt'] !== 3 || $gender_count[1]['cnt'] !== 1 || $gender_count[0]['gender'] !== 'm' || $gender_count[1]['gender'] !== 'f') {
  330. fail('GROUPBY_RETURNING_WRONG_DATA');
  331. }
  332. # query() Checks
  333. // No bound parameters
  334. $first_two_users = $db->query('SELECT * FROM "users" WHERE id <= 2');
  335. checkQuery('SELECT * FROM "users" WHERE id <= 2', 'QUERY_QUERY_MISMATCH');
  336. if (!is_array($first_two_users)) {
  337. fail('QUERY_RETURNING_WRONG_DATA');
  338. }
  339. if (count($first_two_users) !== 2) {
  340. fail('QUERY_RETURNING_WRONG_DATA');
  341. }
  342. // Bound parameters
  343. $first_two_users = $db->query('SELECT * FROM "users" WHERE id <= ?', [2]);
  344. checkQuery('SELECT * FROM "users" WHERE id <= 2', 'QUERY_QUERY_MISMATCH');
  345. if (!is_array($first_two_users)) {
  346. fail('QUERY_RETURNING_WRONG_DATA');
  347. }
  348. if (count($first_two_users) !== 2) {
  349. fail('QUERY_RETURNING_WRONG_DATA');
  350. }
  351. # getLastError Check
  352. $caught = false;
  353. try {
  354. // An entry with an id of 1 already exists, we should get an exception
  355. $Insert = @$db->insert('users', ['id' => 1, 'name' => 'Sam', 'gender' => 'm']);
  356. } catch (PDOException $e) {
  357. $caught = true;
  358. }
  359. if (!$caught) {
  360. fail('INSERT_DUPE_PRIMARY_KEY_NOT_RECOGNIZED');
  361. }
  362. if (strpos($db->getLastError(), 'duplicate key value violates unique constraint') === false) {
  363. fail('INSERT_DUPE_PRIMARY_KEY_WRONG_ERROR_MSG');
  364. }
  365. # count() Re-check
  366. // Call
  367. $count = $db->count('users');
  368. if ($count !== 4) {
  369. fail('COUNT_RETURNING_WRONG_DATA');
  370. }
  371. # has() Checks
  372. // Call
  373. $has = $db->has('users');
  374. if (!is_bool($has)) {
  375. fail('HAS_RETURNING_WRONG_DATA_TYPE');
  376. }
  377. if ($has !== true) {
  378. fail('HAS_RETURNING_WRONG_DATA');
  379. }
  380. # delete() Checks
  381. // Call with where()
  382. $db->where('id', 3)->delete('users');
  383. checkQuery('DELETE FROM "users" WHERE id = 3', 'DELETE_QUERY_MISMATCH');
  384. if ($db->where('id', 3)->has('users')) {
  385. fail('DELETE_WHERE_NOT_DELETING');
  386. }
  387. if ($db->where('id', 3, '<')->count('users') !== 2) {
  388. fail('DELETE_WHERE_DELETING_WRONG_ROWS');
  389. }
  390. // Standalone call
  391. $db->delete('users');
  392. checkQuery('DELETE FROM "users"', 'DELETE_QUERY_MISMATCH');
  393. if ($db->has('users')) {
  394. fail('DELETE_NOT_DELETING');
  395. }
  396. // Array
  397. $db->where('id', [3, 4])->delete('users');
  398. checkQuery('DELETE FROM "users" WHERE id IN (3, 4)', 'DELETE_QUERY_MISMATCH');
  399. // Returning data
  400. $db->insert('users', ['id' => 10, 'name' => 'Ada', 'gender' => 'f']);
  401. $return = $db->where('id', 10)->delete('users', ['name','gender']);
  402. checkQuery('DELETE FROM "users" WHERE id = 10 RETURNING "name", gender', 'DELETE_QUERY_MISMATCH');
  403. if (!is_array($return)) {
  404. fail('DELETE_RETURNING_WRONG_DATA');
  405. }
  406. if (!isset($return['name'], $return['gender']) || $return['name'] !== 'Ada' || $return['gender'] !== 'f') {
  407. fail('DELETE_RETURNING_WRONG_DATA_TYPE_STRING');
  408. }
  409. # join() Checks
  410. $db->query('CREATE TABLE "userdata" (id SERIAL NOT NULL, somevalue INTEGER)');
  411. $db->insert('userdata', ['somevalue' => 1]);
  412. $db->join('userdata', 'userdata.id = users.id', 'LEFT')->where('users.id', 1)->get('users', null, 'users.*');
  413. checkQuery('SELECT "users".* FROM "users" LEFT JOIN "userdata" ON userdata.id = users.id WHERE "users".id = 1', 'JOIN_QUERY_MISMATCH');
  414. $db->join('userdata ud', 'ud.id = u.id', 'LEFT')->where('u.id', 1)->get('users u', null, 'u.*');
  415. checkQuery('SELECT "u".* FROM "users" u LEFT JOIN "userdata" ud ON ud.id = u.id WHERE "u".id = 1', 'JOIN_QUERY_ALIAS_MISMATCH');