|
30 | 30 | *
|
31 | 31 | * HeapTupleSatisfiesMVCC()
|
32 | 32 | * visible to supplied snapshot, excludes current command
|
33 |
| - * HeapTupleSatisfiesNow() |
34 |
| - * visible to instant snapshot, excludes current command |
35 | 33 | * HeapTupleSatisfiesUpdate()
|
36 |
| - * like HeapTupleSatisfiesNow(), but with user-supplied command |
| 34 | + * visible to instant snapshot, with user-supplied command |
37 | 35 | * counter and more complex result
|
38 | 36 | * HeapTupleSatisfiesSelf()
|
39 | 37 | * visible to instant snapshot and current command
|
|
68 | 66 |
|
69 | 67 |
|
70 | 68 | /* Static variables representing various special snapshot semantics */
|
71 |
| -SnapshotData SnapshotNowData = {HeapTupleSatisfiesNow}; |
72 | 69 | SnapshotData SnapshotSelfData = {HeapTupleSatisfiesSelf};
|
73 | 70 | SnapshotData SnapshotAnyData = {HeapTupleSatisfiesAny};
|
74 | 71 | SnapshotData SnapshotToastData = {HeapTupleSatisfiesToast};
|
@@ -323,212 +320,6 @@ HeapTupleSatisfiesSelf(HeapTuple htup, Snapshot snapshot, Buffer buffer)
|
323 | 320 | return false;
|
324 | 321 | }
|
325 | 322 |
|
326 |
| -/* |
327 |
| - * HeapTupleSatisfiesNow |
328 |
| - * True iff heap tuple is valid "now". |
329 |
| - * |
330 |
| - * Here, we consider the effects of: |
331 |
| - * all committed transactions (as of the current instant) |
332 |
| - * previous commands of this transaction |
333 |
| - * |
334 |
| - * Note we do _not_ include changes made by the current command. This |
335 |
| - * solves the "Halloween problem" wherein an UPDATE might try to re-update |
336 |
| - * its own output tuples, http://en.wikipedia.org/wiki/Halloween_Problem. |
337 |
| - * |
338 |
| - * Note: |
339 |
| - * Assumes heap tuple is valid. |
340 |
| - * |
341 |
| - * The satisfaction of "now" requires the following: |
342 |
| - * |
343 |
| - * ((Xmin == my-transaction && inserted by the current transaction |
344 |
| - * Cmin < my-command && before this command, and |
345 |
| - * (Xmax is null || the row has not been deleted, or |
346 |
| - * (Xmax == my-transaction && it was deleted by the current transaction |
347 |
| - * Cmax >= my-command))) but not before this command, |
348 |
| - * || or |
349 |
| - * (Xmin is committed && the row was inserted by a committed transaction, and |
350 |
| - * (Xmax is null || the row has not been deleted, or |
351 |
| - * (Xmax == my-transaction && the row is being deleted by this transaction |
352 |
| - * Cmax >= my-command) || but it's not deleted "yet", or |
353 |
| - * (Xmax != my-transaction && the row was deleted by another transaction |
354 |
| - * Xmax is not committed)))) that has not been committed |
355 |
| - * |
356 |
| - */ |
357 |
| -bool |
358 |
| -HeapTupleSatisfiesNow(HeapTuple htup, Snapshot snapshot, Buffer buffer) |
359 |
| -{ |
360 |
| - HeapTupleHeader tuple = htup->t_data; |
361 |
| - Assert(ItemPointerIsValid(&htup->t_self)); |
362 |
| - Assert(htup->t_tableOid != InvalidOid); |
363 |
| - |
364 |
| - if (!(tuple->t_infomask & HEAP_XMIN_COMMITTED)) |
365 |
| - { |
366 |
| - if (tuple->t_infomask & HEAP_XMIN_INVALID) |
367 |
| - return false; |
368 |
| - |
369 |
| - /* Used by pre-9.0 binary upgrades */ |
370 |
| - if (tuple->t_infomask & HEAP_MOVED_OFF) |
371 |
| - { |
372 |
| - TransactionId xvac = HeapTupleHeaderGetXvac(tuple); |
373 |
| - |
374 |
| - if (TransactionIdIsCurrentTransactionId(xvac)) |
375 |
| - return false; |
376 |
| - if (!TransactionIdIsInProgress(xvac)) |
377 |
| - { |
378 |
| - if (TransactionIdDidCommit(xvac)) |
379 |
| - { |
380 |
| - SetHintBits(tuple, buffer, HEAP_XMIN_INVALID, |
381 |
| - InvalidTransactionId); |
382 |
| - return false; |
383 |
| - } |
384 |
| - SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED, |
385 |
| - InvalidTransactionId); |
386 |
| - } |
387 |
| - } |
388 |
| - /* Used by pre-9.0 binary upgrades */ |
389 |
| - else if (tuple->t_infomask & HEAP_MOVED_IN) |
390 |
| - { |
391 |
| - TransactionId xvac = HeapTupleHeaderGetXvac(tuple); |
392 |
| - |
393 |
| - if (!TransactionIdIsCurrentTransactionId(xvac)) |
394 |
| - { |
395 |
| - if (TransactionIdIsInProgress(xvac)) |
396 |
| - return false; |
397 |
| - if (TransactionIdDidCommit(xvac)) |
398 |
| - SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED, |
399 |
| - InvalidTransactionId); |
400 |
| - else |
401 |
| - { |
402 |
| - SetHintBits(tuple, buffer, HEAP_XMIN_INVALID, |
403 |
| - InvalidTransactionId); |
404 |
| - return false; |
405 |
| - } |
406 |
| - } |
407 |
| - } |
408 |
| - else if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXmin(tuple))) |
409 |
| - { |
410 |
| - if (HeapTupleHeaderGetCmin(tuple) >= GetCurrentCommandId(false)) |
411 |
| - return false; /* inserted after scan started */ |
412 |
| - |
413 |
| - if (tuple->t_infomask & HEAP_XMAX_INVALID) /* xid invalid */ |
414 |
| - return true; |
415 |
| - |
416 |
| - if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask)) /* not deleter */ |
417 |
| - return true; |
418 |
| - |
419 |
| - if (tuple->t_infomask & HEAP_XMAX_IS_MULTI) |
420 |
| - { |
421 |
| - TransactionId xmax; |
422 |
| - |
423 |
| - xmax = HeapTupleGetUpdateXid(tuple); |
424 |
| - if (!TransactionIdIsValid(xmax)) |
425 |
| - return true; |
426 |
| - |
427 |
| - /* updating subtransaction must have aborted */ |
428 |
| - if (!TransactionIdIsCurrentTransactionId(xmax)) |
429 |
| - return true; |
430 |
| - else |
431 |
| - return false; |
432 |
| - } |
433 |
| - |
434 |
| - if (!TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmax(tuple))) |
435 |
| - { |
436 |
| - /* deleting subtransaction must have aborted */ |
437 |
| - SetHintBits(tuple, buffer, HEAP_XMAX_INVALID, |
438 |
| - InvalidTransactionId); |
439 |
| - return true; |
440 |
| - } |
441 |
| - |
442 |
| - if (HeapTupleHeaderGetCmax(tuple) >= GetCurrentCommandId(false)) |
443 |
| - return true; /* deleted after scan started */ |
444 |
| - else |
445 |
| - return false; /* deleted before scan started */ |
446 |
| - } |
447 |
| - else if (TransactionIdIsInProgress(HeapTupleHeaderGetXmin(tuple))) |
448 |
| - return false; |
449 |
| - else if (TransactionIdDidCommit(HeapTupleHeaderGetXmin(tuple))) |
450 |
| - SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED, |
451 |
| - HeapTupleHeaderGetXmin(tuple)); |
452 |
| - else |
453 |
| - { |
454 |
| - /* it must have aborted or crashed */ |
455 |
| - SetHintBits(tuple, buffer, HEAP_XMIN_INVALID, |
456 |
| - InvalidTransactionId); |
457 |
| - return false; |
458 |
| - } |
459 |
| - } |
460 |
| - |
461 |
| - /* by here, the inserting transaction has committed */ |
462 |
| - |
463 |
| - if (tuple->t_infomask & HEAP_XMAX_INVALID) /* xid invalid or aborted */ |
464 |
| - return true; |
465 |
| - |
466 |
| - if (tuple->t_infomask & HEAP_XMAX_COMMITTED) |
467 |
| - { |
468 |
| - if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask)) |
469 |
| - return true; |
470 |
| - return false; |
471 |
| - } |
472 |
| - |
473 |
| - if (tuple->t_infomask & HEAP_XMAX_IS_MULTI) |
474 |
| - { |
475 |
| - TransactionId xmax; |
476 |
| - |
477 |
| - if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask)) |
478 |
| - return true; |
479 |
| - |
480 |
| - xmax = HeapTupleGetUpdateXid(tuple); |
481 |
| - if (!TransactionIdIsValid(xmax)) |
482 |
| - return true; |
483 |
| - if (TransactionIdIsCurrentTransactionId(xmax)) |
484 |
| - { |
485 |
| - if (HeapTupleHeaderGetCmax(tuple) >= GetCurrentCommandId(false)) |
486 |
| - return true; /* deleted after scan started */ |
487 |
| - else |
488 |
| - return false; /* deleted before scan started */ |
489 |
| - } |
490 |
| - if (TransactionIdIsInProgress(xmax)) |
491 |
| - return true; |
492 |
| - if (TransactionIdDidCommit(xmax)) |
493 |
| - return false; |
494 |
| - return true; |
495 |
| - } |
496 |
| - |
497 |
| - if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmax(tuple))) |
498 |
| - { |
499 |
| - if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask)) |
500 |
| - return true; |
501 |
| - if (HeapTupleHeaderGetCmax(tuple) >= GetCurrentCommandId(false)) |
502 |
| - return true; /* deleted after scan started */ |
503 |
| - else |
504 |
| - return false; /* deleted before scan started */ |
505 |
| - } |
506 |
| - |
507 |
| - if (TransactionIdIsInProgress(HeapTupleHeaderGetRawXmax(tuple))) |
508 |
| - return true; |
509 |
| - |
510 |
| - if (!TransactionIdDidCommit(HeapTupleHeaderGetRawXmax(tuple))) |
511 |
| - { |
512 |
| - /* it must have aborted or crashed */ |
513 |
| - SetHintBits(tuple, buffer, HEAP_XMAX_INVALID, |
514 |
| - InvalidTransactionId); |
515 |
| - return true; |
516 |
| - } |
517 |
| - |
518 |
| - /* xmax transaction committed */ |
519 |
| - |
520 |
| - if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask)) |
521 |
| - { |
522 |
| - SetHintBits(tuple, buffer, HEAP_XMAX_INVALID, |
523 |
| - InvalidTransactionId); |
524 |
| - return true; |
525 |
| - } |
526 |
| - |
527 |
| - SetHintBits(tuple, buffer, HEAP_XMAX_COMMITTED, |
528 |
| - HeapTupleHeaderGetRawXmax(tuple)); |
529 |
| - return false; |
530 |
| -} |
531 |
| - |
532 | 323 | /*
|
533 | 324 | * HeapTupleSatisfiesAny
|
534 | 325 | * Dummy "satisfies" routine: any tuple satisfies SnapshotAny.
|
@@ -614,10 +405,10 @@ HeapTupleSatisfiesToast(HeapTuple htup, Snapshot snapshot,
|
614 | 405 | /*
|
615 | 406 | * HeapTupleSatisfiesUpdate
|
616 | 407 | *
|
617 |
| - * Same logic as HeapTupleSatisfiesNow, but returns a more detailed result |
618 |
| - * code, since UPDATE needs to know more than "is it visible?". Also, |
619 |
| - * tuples of my own xact are tested against the passed CommandId not |
620 |
| - * CurrentCommandId. |
| 408 | + * This function returns a more detailed result code than most of the |
| 409 | + * functions in this file, since UPDATE needs to know more than "is it |
| 410 | + * visible?". It also allows for user-supplied CommandId rather than |
| 411 | + * relying on CurrentCommandId. |
621 | 412 | *
|
622 | 413 | * The possible return codes are:
|
623 | 414 | *
|
@@ -1051,10 +842,6 @@ HeapTupleSatisfiesDirty(HeapTuple htup, Snapshot snapshot,
|
1051 | 842 | * transactions started after the snapshot was taken
|
1052 | 843 | * changes made by the current command
|
1053 | 844 | *
|
1054 |
| - * This is the same as HeapTupleSatisfiesNow, except that transactions that |
1055 |
| - * were in progress or as yet unstarted when the snapshot was taken will |
1056 |
| - * be treated as uncommitted, even if they have committed by now. |
1057 |
| - * |
1058 | 845 | * (Notice, however, that the tuple status hint bits will be updated on the
|
1059 | 846 | * basis of the true state of the transaction, even if we then pretend we
|
1060 | 847 | * can't see it.)
|
|
0 commit comments