|South Africa scored 351-5 with AB de Villiers and opener Hashim Amla both hitting centuries [AFP]
Shahid Afridi, the Pakistan captain, has led his side to victory in the Cricket World Cup with a nerveless display of leg-spin, shattering Canada's hopes of a famous triumph.
In Thursday's other match, South Africa mauled the Netherlands by 231 runs.
Just a day after Ireland had clinched a record-breaking win over England, Canada were dreaming of a similar sensational upset when they bowled out the 1992 champions for a paltry 184 in Colombo.
But the Canadians, who had already suffered a 210-run loss to Sri Lanka and a 175-run defeat to Zimbabwe, were undone by Afridi's one-man show.
The 31-year-old skipper claimed 5-23 to help dismiss Canada for 138 and seal a 46-run victory which put Pakistan back on top of Group A and with one foot in the quarter-finals with a third win in three matches.
Canada had been well placed at 104-3 before Afridi sent back Rizwan Cheema, Jimmy Hansra, Harvir Baidwan and Tyson Gordon in rapid succession.
Afridi said his team's woeful batting performance was a wake-up call.
"I think sometimes we need some partnerships and that's what we were missing. Partnerships are very important," he said.
"We're not going to repeat this batting performance. But I think the bowlers are doing very well and we are very confident."
Canada captain Ashish Bagai admitted that his team was being outclassed after Thursday's 138 followed earlier totals of 122 and 123 in the tournament.
"Fighting is one thing but getting over the line is taking it to another level. We had a good chance to show everybody what we've put in over the last few years and we fell short," he said.
South Africa top table
Earlier, South Africa went to the top of Group B with two wins in two matches after beating the Netherlands in Mohali, India, producing the fourth biggest win in World Cup history.
The Proteas compiled 351-5 with AB de Villiers and opener Hashim Amla both hitting centuries and putting on 221 for the third wicket.
The Netherlands were dismissed for 120 in 34.5 overs, for a successive heavy loss following a 215-run capitulation to West Indies.
Imram Tahir, South Africa's new spin star, wrapped up the Dutch tail, claiming the last three wickets with some big-turning deliveries.
Graeme Smith, the South African captain, said his side would not get carried away.
"We've got two big games coming our way, England [on Sunday] and then India, so obviously it's good to gain some confidence going into the big games," Smith said.
Peter Borren, the Netherlands captain, said: "If you look at what we have done in our last two scores, maybe the pressure of chasing big, big totals was too much.''