Overview

  • Heap page 에서 Heap tuple 을 하나 읽어 TableScanDesc 의 current tuple 을 업데이트한다.
  • 본 함수에서는 heap page 를 하나 읽어 visible tuple 을 TableScanDesc 에 전부 때려넣은 뒤에, 해당 tuple 들을 모두 소진할 때까지는 이 함수가 호출될때마다 저 visible tuple 에서 하나씩 꺼내 current tuple 을 업데이트하는 식으로 진행된다.
  • 따라서 (A) 새로운 page 를 fetch 해야 하는 경우와 (B) 기존것을 계속 사용하는 경우를 나눠서 생각해보자.

Line Ref

Local Variable

  • tuple: TableScanDesc 의 current tuple 을 가리키는 pointer 이다.
  • page: Buffer page data 를 가리키는 pointer 이다.
  • lineindex: TableScanDesc 의 visible tuple array 에서의 현재 소진하고자 하는 tuple 에 대한 index 이다.
  • linesleft: TableScanDesc 의 visible tuple array 에서 아직 소진하지 않은 tuple 들의 개수이다.
  • lpp: Tuple ID 이다.
  • lineoff: 소진하고자 하는 tuple 의 page 내에서의 offset 이다.

(A) Fetch New Page

  • L967-L980: Page 를 새로 fetch 해야 한다면, scan->rs_initedfalse 이다. 따라서 이부분은 skip 된다.
  • L982-L1027: Page 를 fetch 해오고, visible tuple 을 정리한 다음, current tuple 을 업데이트한다.
    • L988-L994: heap_fetch_next_buffer() 를 호출해 다음 page 를 읽어 buffer 에 올리고 TableScanDesc 에서 해당 buffer 를 참조하도록 한다.
    • L996-L997: heap_prepare_pagescan() 를 호출해 visible tuple 을 전부 골라 TableScanDesc 에 넣는다.
    • L998-L1000: 새로운 page 의 tuple 들을 iterate 하기 위한 변수들을 설정한다.
      • linesleft: Visible tuple 를 하나도 소진하지 않았기 때문에, scan->rs_ntuples 로 설정된다.
      • lineindex: 마찬가지로 visible tuple 을 하나도 소진하지 않았기 때문에, forward direction 이면 0, backward direction 이면 linesleft - 1 로 설정된다.
    • L1005-L1026: Visible tuple 을 하나씩 iterate 하며 소진한다.
      • L1010-L1012: 현재 소진하고자 하는 tuple (scan->rs_vistuples[lineindex]) 에 대한 lineofflpp 를 설정한다.
      • L1014-L1016: 현재 소진하고자 하는 tuple 을 tuple 에 등록한다.
      • L1018-L1022: 만약 현재 소진하고자 하는 tuple 이 scan key 와 맞지 않는다면, for loop 으로 다시 처음으로 돌아가 다음 tuple 을 소진한다.
      • L1024-L1025: TableScanDesc 의 current tuple index (scan->rs_cindex) 를 lineindex 로 설정한 뒤 return 한다.

(B) Use Existing Page

  • L967-L980: 기존의 page 를 계속 사용하는 경우, 다음 visible tuple 을 소진하기 위한 변수들을 설정한다.
    • L969-L970: Buffer 에서 page 를 가져와 page 를 설정한다.
    • L972: TableScanDesc 의 current index 에서 scan direction 에 따라 1을 더하거나 빼서 lineindex 를 설정한다.
    • L973-L977: Scan direction 에 따라 linesleft 를 설정한다.
    • L979: 이후 1005 번째 줄로 바로 jump 한다.
  • L1005-L1026: Visible tuple 을 하나씩 iterate 하며 소진한다.
    • L1010-L1012: 현재 소진하고자 하는 tuple (scan->rs_vistuples[lineindex]) 에 대한 lineofflpp 를 설정한다.
    • L1014-L1016: 현재 소진하고자 하는 tuple 을 tuple 에 등록한다.
    • L1018-L1022: 만약 현재 소진하고자 하는 tuple 이 scan key 와 맞지 않는다면, for loop 으로 다시 처음으로 돌아가 다음 tuple 을 소진한다.
    • L1024-L1025: TableScanDesc 의 current tuple index (scan->rs_cindex) 를 lineindex 로 설정한 뒤 return 한다.
  • L1029-L1036: 만약 더 이상 visible tuple 이 해당 page 에 없다면, TableScanDesc 의 값들을 초기화하고 scan->rs_initedfalse 로 설정해 다음에 이 함수가 호출되었을 때 (A) 를 수행하도록 한다.