+----------------------------------------------------------------------
+Statistical procedures:
+
+For each case we read from the input program:
+
+1. Execute permanent transformations. If these drop the case, stop.
+2. N OF CASES. If we have already written N cases, stop.
+3. Write case to replacement active file.
+4. Execute temporary transformations. If these drop the case, stop.
+5. Post-TEMPORARY N OF CASES. If we have already analyzed N cases, stop.
+6. FILTER, PROCESS IF. If these drop the case, stop.
+7. Pass case to procedure.
+
+Ugly cases:
+
+LAG records cases in step 3.
+
+AGGREGATE: When output goes to an external file, this is just an ordinary
+procedure. When output goes to the active file, step 3 should be skipped,
+because AGGREGATE creates its own case sink and writes to it in step 7. Also,
+TEMPORARY has no effect and we just cancel it. Regardless of direction of
+output, we should not implement AGGREGATE through a transformation because that
+will fail to honor FILTER, PROCESS IF, N OF CASES.
+
+ADD FILES: Essentially an input program. It silently cancels unclosed LOOPs
+and DO IFs. If the active file is used for input, then runs EXECUTE (if there
+are any transformations) and then steals vfm_source and encapsulates it. If
+the active file is not used for input, then it cancels all the transformations
+and deletes the original active file.
+
+CASESTOVARS: ???
+
+FLIP:
+
+MATCH FILES: Similar to AGGREGATE. This is a procedure. When the active file
+is used for input, it reads the active file; otherwise, it just cancels all the
+transformations and deletes the original active file. Step 3 should be
+skipped, because MATCH FILES creates its own case sink and writes to it in step
+7. TEMPORARY is not allowed.
+
+MODIFY VARS:
+
+REPEATING DATA:
+
+SORT CASES:
+
+UPDATE: same as ADD FILES.
+
+VARSTOCASES: ???
+----------------------------------------------------------------------
+N OF CASES
+
+ * Before TEMPORARY, limits number of cases sent to the sink.
+
+ * After TEMPORARY, limits number of cases sent to the procedure.
+
+ * Without TEMPORARY, those are the same cases, so it limits both.
+
+SAMPLE
+
+ * Sample is just a transformation. It has no special properties.
+
+FILTER
+
+ * Always selects cases sent to the procedure.
+
+ * No effect on cases sent to sink.
+
+ * Before TEMPORARY, selection is permanent. After TEMPORARY,
+ selection stops after a procedure.
+
+PROCESS IF
+
+ * Always selects cases sent to the procedure.
+
+ * No effect on cases sent to sink.
+
+ * Always stops after a procedure.
+
+SPLIT FILE
+
+ * Ignored by AGGREGATE. Used when procedures write matrices.
+
+ * Always applies to the procedure.
+
+ * Before TEMPORARY, splitting is permanent. After TEMPORARY,
+ splitting stops after a procedure.
+
+TEMPORARY
+
+ * TEMPORARY has no effect on AGGREGATE when output goes to the active file.
+
+ * SORT CASES, ADD FILES, RENAME VARIABLES, CASESTOVARS, VARSTOCASES,
+ COMPUTE with a lag function cannot be used after TEMPORARY.
+
+ * Cannot be used in DO IF...END IF or LOOP...END LOOP.
+
+ * FLIP ignores TEMPORARY. All transformations become permanent.
+
+ * MATCH FILES and UPDATE cannot be used after TEMPORARY if active
+ file is an input source.
+
+ * RENAME VARIABLES is invalid after TEMPORARY.
+
+ * WEIGHT, SPLIT FILE, N OF CASES, FILTER, PROCESS IF apply only to
+ the next procedure when used after TEMPORARY.
+
+WEIGHT
+
+ * Always applies to the procedure.
+
+ * Before TEMPORARY, weighting is permanent. After TEMPORARY,
+ weighting stops after a procedure.
+
+