It was a Sunday night fight for Democrats in Charleston, South Carolina as Hillary Clinton and Bernie Sanders slugged it out on a series of issues in the party’s final presidential debate before the Iowa caucuses.

As was widely expected, the two biggest fights of the night came on gun control and on health care, two issues on which the two leading candidates have battled over in recent weeks. Clinton, seeing Sanders gain on her in the polls, has attacked the Vermont senator as soft on guns. She and her surrogates have also attacked Sanders for his health-care proposal, claiming it would tear up the Affordable Care Act.

Clinton scored an early direct hit on Sanders over guns. “I have made it clear, based on Senator Sanders’s own record that he has voted with the NRA, with the gun lobby numerous times,” she said, with a long list of votes he had cast. It was brutal, and effective. But on health care, she couldn’t get the upper hand so easily. Clinton’s attack on Sanders is fairly implausible: She argues that because his attempt to pass a single-payer health system (“Medicare for all,” he calls it) would supersede Obamacare, he is angling to tear down the recent reforms. In essence, she’s claiming that he wants to “repeal and replace” Obamacare, just like the GOP says it does. Sanders rebuts that he’s just strengthening the work that’s already been done. Clinton took heat for her line of attack Sunday night, allowing Sanders a chance to boost his unabashedly liberal reforms.

This battle masks an essential consensus: Both Sanders and Clinton back universal health care. Their differences are about how to achieve that. Sanders, the old radical, believes the system needs a complete overhaul. Clinton, the consummate gradualist, believes that such a step is politically impossible—a point she made effectively on Sunday. If Democrats couldn’t pass single-payer with a Senate supermajority, how would Sanders do it with a Republican House and, at best, a narrow Senate edge? She knows the limitations of health-care politics better than almost anyone. This is, as Ezra Klein recently noted, a far more honest and effective attack on Sanders’s health plan than claiming he’s somehow an opponent of Obamacare, yet it’s one Clinton has largely avoided making. (The conversation also offered the most detailed critique of Obamacare to be heard so far—much more than in any Republican debate.)

The split over health care is a microcosm of the difference between the two candidates. Sanders offers Democratic voters an alluring, pure, crusading figure for a party moving leftward. Clinton offers them a more pragmatic but less emotionally fulfilling vision. On several occasions throughout the debate, Clinton tried to offer a reality check: However great Sanders’s goals may sound, can he really make them happen? This has always been the fundamental gap between them, but as the polls tighten and the first caucuses draw near, they have come into even sharper relief.

If this debate has much effect on the race, it will likely be in helping Democrats decide whether to vote for what they want or what they feel they need. Nothing that happened seems likely to shift the momentum significantly. That means it was a good night for Sanders, who’s been on the rise and delivered a strong performance; if he had fewer quotable moments, he also managed to avoid stumbles. Electorally, two questions highlighted the candidates’ respective difficulties. Sanders was asked why he trailed among minority voters, and Clinton why she lagged among young voters. Neither had a good answer for how they’d change these dynamics, except to say that they’d keep working at it.

But Clinton also had another strong debate. Her strategy for the night seemed to be to tie herself closely to President Obama. This is the subtext of her defense of the Affordable Care Act against Sanders’s critiques. Later, when Sanders argued she was too close to Wall Street, Clinton replied that she could take the heat but that she would not brook Sanders criticizing the Dodd-Frank financial reforms that Obama championed and signed into law. This is in part an admission that Clinton still has no good answer to the claim that she’s too close to Wall Street. She has, however, learned to pull her opponents into the muck, ticking off O’Malley’s former fundraising from Wall Street and Sanders’s 2000 vote to deregulate derivatives. Clinton also tried to portray Sanders as an enemy of Obama elsewhere, mentioning his suggestion in 2011 that the president have a primary challenge.

Martin O’Malley delivered perhaps his strongest debate of the campaign—when he was able to get a word in edgewise, which wasn’t much. He tangled with Clinton over her ties to bankers and assailed Sanders—until recently an independent—for not being a loyal Democrat. But O’Malley remains essentially an afterthought. He was only on stage tonight thanks to rounding up of poll numbers, and while Iowa is unpredictable, this debate didn’t look like the moment to vault him ahead of Sanders or Clinton.

With the debate falling on the eve of Martin Luther King Day, one might have expected robust discussion of racial issues, but the topic was dispatched with surprising brevity. All three candidates agreed on the need for tougher accountability for police who shoot civilians and on racial justice in the criminal-justice system. Otherwise, the topic practically disappeared from view—although Clinton was able to deliver a fierce spiel about lead poisoning in Flint, Michigan, in her closing statement, saying that if white residents of suburban Detroit had bad water the problem would have been solved long ago.

On foreign policy, the candidates all agreed that there should be no large deployment of ground troops in the Middle East, and that improved relations with Iran were a good thing. Clinton squirmed a bit over the infamous “reset” with Russia. Sanders offered an odd answer on ISIS, calling for a Muslim army to defeat the group but never indicating who would make up such an army—Sunnis? Shiites? Arabs? Persians?—or would lead it.

Climate change offered another area for agreement, as summed up by Sanders: “The debate is over. Climate change is real. It is already causing major problems, and if we don’t move quickly and decisively, a bad situation will become worse.” Frustratingly, a question about privacy received short shrift, with only O’Malley getting a chance to answer it head on. That was one of few missteps from an otherwise businesslike and effective moderation team of Lester Holt and Andrea Mitchell. Also missing from the debate was any discussion of reproductive rights or immigration reform, two core Democratic issues.

But more conspicuous by absence was the kumbaya vibe of previous meetings. On Sunday, all three candidates frequently invoked “respect,” a reliable indicator of tension. In contrast, and incredibly, no one took a potshot at Donald Trump until more than an hour into the debate. The candidates have worked hard in earlier debates to remind viewers that whatever their differences, the Democrats are essentially on the same page, and they have also derided the fractious, bellicose Republican debates. But with the Iowa caucuses just a couple weeks away and the polls looking tight, Sanders and Clinton are discovering that maybe the Republicans are on to something: Internecine warfare might just have some virtues.