Manchester City managed just one shot on target, despite dominating possession, as Stoke hung on for a 0-0 draw at The Etihad.
It was the first time that Pep Guardiola’s side had failed to score in a home Premier League game, as Mark Hughes’ men defended for their lives on Wednesday night.
The hosts managed 65% possession, but could not break through a well-drilled Stoke defence with Leroy Sane wasting a gilt-edged chance in the second half, shooting over the bar from 12 yards.
City, who rested the in-form Raheem Sterling, came to life after a drab first half but were unable to find a way through the Potters’ stubborn rearguard.
The result lifted City level with second-placed Tottenham but the overwhelming feeling at the final whistle was of an opportunity missed.
Sterling was not included in the matchday squad while the influential David Silva only appeared as a second-half substitute as manager Pep Guardiola rotated his resources.
It took City a long time to hit their stride and Stoke had an early chance after Gael Clichy lost his footing. Mame Biram Diouf took advantage by sliding in to meet a ball from the left but he failed to make clean contact and Willy Caballero saved.
City were troubled again when the lively Ramadan Sobhi burst into the area and beat Nicolas Otamendi, who pulled out of a tackle that might have proved costly. The Egyptian whipped in a cross but Bacary Sagna hooked clear.
City struggled to generate momentum. Jesus Navas found space to get in crosses from the right but was unable to pick out team-mates while key duo Sergio Aguero and Kevin De Bruyne were subdued.
Sane did get a couple of opportunities to show his pace but was first halted by a fine tackle by Diouf and was then tripped outside the area by Phil Bardsley. Aleksandar Kolarov forced a good save from Lee Grant from the resulting free-kick.
Most of this action occurred in the early stages and it was not until first-half injury time City got behind the defence, but De Bruyne missed his kick stretching to reach an Otamendi long ball.
City showed greater intent after the break, especially after the introduction of Silva as replacement for Navas.
But despite creating some chances, the frustration continued.
Sane left Bruno Martins Indi trailing with another lightning burst to tee up Aguero but Erik Pieters managed to deflect the Argentinian’s shot wide.
Sane had an opportunity himself after good work from De Bruyne but a ricochet off Joe Allen caused him to lash over the bar. Yaya Toure also fired over and Silva dragged a gilt-edged chance narrowly wide.
Another drive from Silva was deflected for a corner and Otamendi headed over from the set-piece.
City pushed to the end but Aguero drove into the side-netting and substitute Kelechi Iheanacho volleyed an injury-time chance wide before Sane failed to connect with a cross.