@@ -354,6 +354,93 @@ SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C";
354
354
SELECT pg_stat_statements_reset() | 1 | 1
355
355
(5 rows)
356
356
357
+ --
358
+ -- queries with locking clauses
359
+ --
360
+ CREATE TABLE pgss_a (id integer PRIMARY KEY);
361
+ CREATE TABLE pgss_b (id integer PRIMARY KEY, a_id integer REFERENCES pgss_a);
362
+ SELECT pg_stat_statements_reset();
363
+ pg_stat_statements_reset
364
+ --------------------------
365
+
366
+ (1 row)
367
+
368
+ -- control query
369
+ SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id;
370
+ id | id | a_id
371
+ ----+----+------
372
+ (0 rows)
373
+
374
+ -- test range tables
375
+ SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE;
376
+ id | id | a_id
377
+ ----+----+------
378
+ (0 rows)
379
+
380
+ SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_a;
381
+ id | id | a_id
382
+ ----+----+------
383
+ (0 rows)
384
+
385
+ SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_b;
386
+ id | id | a_id
387
+ ----+----+------
388
+ (0 rows)
389
+
390
+ SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_a, pgss_b; -- matches plain "FOR UPDATE"
391
+ id | id | a_id
392
+ ----+----+------
393
+ (0 rows)
394
+
395
+ SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_b, pgss_a;
396
+ id | id | a_id
397
+ ----+----+------
398
+ (0 rows)
399
+
400
+ -- test strengths
401
+ SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR NO KEY UPDATE;
402
+ id | id | a_id
403
+ ----+----+------
404
+ (0 rows)
405
+
406
+ SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR SHARE;
407
+ id | id | a_id
408
+ ----+----+------
409
+ (0 rows)
410
+
411
+ SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR KEY SHARE;
412
+ id | id | a_id
413
+ ----+----+------
414
+ (0 rows)
415
+
416
+ -- test wait policies
417
+ SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE NOWAIT;
418
+ id | id | a_id
419
+ ----+----+------
420
+ (0 rows)
421
+
422
+ SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE SKIP LOCKED;
423
+ id | id | a_id
424
+ ----+----+------
425
+ (0 rows)
426
+
427
+ SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C";
428
+ calls | query
429
+ -------+------------------------------------------------------------------------------------------
430
+ 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id
431
+ 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR KEY SHARE
432
+ 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR NO KEY UPDATE
433
+ 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR SHARE
434
+ 2 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE
435
+ 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE NOWAIT
436
+ 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_a
437
+ 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_b
438
+ 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_b, pgss_a
439
+ 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE SKIP LOCKED
440
+ 1 | SELECT pg_stat_statements_reset()
441
+ (11 rows)
442
+
443
+ DROP TABLE pgss_a, pgss_b CASCADE;
357
444
--
358
445
-- utility commands
359
446
--
0 commit comments