docs: protected PlanNode createCanonicalPlan( QueryContext context,
                                              SetQuery query ) {
          // Process the left and right parts of the query ...
          PlanNode left = createPlan(context, query.getLeft());
          PlanNode right = createPlan(context, query.getRight());
  
          // Wrap in a set operation node ...
          PlanNode plan = new PlanNode(Type.SET_OPERATION);
          plan.addChildren(left, right);
          plan.setProperty(Property.SET_OPERATION, query.operation());
          plan.setProperty(Property.SET_USE_ALL, query.isAll());
  
          // Process the orderings and limits ...
          plan = attachSorting(context, plan, query.orderings());
          plan = attachLimits(context, plan, query.getLimits());
  
          // Capture if we're limiting the results to 1 row and no offset and no sorting ...
          if (query.getLimits().isLimitedToSingleRowWithNoOffset() && query.orderings().isEmpty()) {
              context.getHints().isExistsQuery = true;
          }
          return plan;
      }