text: // Test covered query with sort stage between index scan and projection.
  //
  // @tags: [
  //   # Cannot implicitly shard accessed collections because queries on a sharded collection are not
  //   # able to be covered when they aren't on the shard key since the document needs to be fetched
  //   # in order to apply the SHARDING_FILTER stage.
  //   assumes_unsharded_collection,
  // ]
  
  (function() {
  "use strict";
  
  load("jstests/libs/analyze_plan.js");  // For 'isIndexOnly', 'getPlanStage' and 'getWinningPlan'.
  
  const coll = db.covered_query_with_sort;
  coll.drop();
  
  assert.commandWorked(coll.insert([
      {y: 0, x: 0},
      {y: 0, x: 1},
      {y: 1, x: -1},
  ]));
  assert.commandWorked(coll.createIndex({y: 1, x: 1}));
  
  function buildQuery() {
      return coll.find({y: {$gte: 0}, x: {$gte: 0}}, {_id: 0, y: 1, x: 1}).sort({x: -1}).limit(2);
  }
  
  // Ensure that query is covered.
  const plan = buildQuery().explain();
  assert(isIndexOnly(db, getWinningPlan(plan.queryPlanner)), plan);
  
  // Ensure that query plan has shape IXSCAN => SORT => PROJECTION_COVERED.
  const projectionCoveredStage = getPlanStage(plan, "PROJECTION_COVERED");
  assert.neq(projectionCoveredStage, null, plan);
  const sortStage = getPlanStage(projectionCoveredStage, "SORT");
  assert.neq(sortStage, null, plan);
  const ixScanStage = getPlanStage(projectionCoveredStage, "IXSCAN");
  assert.neq(ixScanStage, null, plan);
  
  const results = buildQuery().toArray();
  assert.eq(results, [{y: 0, x: 1}, {y: 0, x: 0}], results);
  }());