Оператор, как и любая функция, идентифицируется сигнатурой. Тип возврата и модификаторы перед именем функции / оператора не включаются в это. Имена ваших операторов здесь
operator++()
operator++(int)
Это единственный способ, которым компилятор отличает эти два. Что касается возвращаемых значений Digit&
и Digit
; Они необходимы из-за того, что предполагается использовать ++ x и x ++.
Узел материализации означает, что вывод всего, что находится под ним в дереве (которое может быть сканированием, полным набором объединений или чем-то подобным), переносится в память перед верхним узлом выполняется. Обычно это делается, когда внешнему узлу нужен источник, который он может повторно сканировать по той или иной причине.
Итак, в вашем случае планировщик определяет, что результат сканирования одной из ваших таблиц умещается в памяти, и это до тех пор, пока не появится возможность выбрать операцию верхнего соединения, которая требует повторного сканирования, но при этом дешевле.
Это означает, что он не может использовать какой-либо индекс (или аналогичный метод), чтобы сделать соединение эффективным, поэтому в качестве последнего средства он материализует результат из одной из таблиц, чтобы иметь меньший набор для работы при соединении с другой таблицей.