|
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