« first day (4349 days earlier)      last day (511 days later) » 
00:00 - 21:0021:00 - 00:00

12:01 AM
Czech constraints were a mistake
2
A: Why won't this UDF work in this check constraint?

ypercubeᵀᴹThe error is due to that (although there is no BOOLEAN datatype in SQL Server) the expression in a CHECK constraint must result in a boolean value. Yours result in a bit value. You can technically solve this but changing your CHECK constraint to: CHECK(dbo.checkIfAuthorized(signedBy, 8) = CAS...

There are always more typos
 
12:28 AM
Edited.
If someone betted I added more typos, I wouldn't bet against them ;)
 
@PaulWhite i could yperthread my e cores
 
 
7 hours later…
7:06 AM
Morning
 
 
2 hours later…
9:30 AM
Morning
 
 
2 hours later…
11:01 AM
thnx for the edits guys (Paul, Tom)
 
and Tibor
 
yeah but he isn't in this room ;)
The article by Alex Kuznetsov is only available in webarchive, as far as I searched.
It seems to have been in sqlblog.com at some point
 
Yes. Sadly, a lot of Alex K content was simply lost when SQLblog.com died
Some of us migrated content to new sites, many did not
 
11:40 AM
@ErikDarling My feelings!
 
12:40 PM
@MichaelGreen come get some
 
anyone feel like spot checking this for dumbness?
0
A: CTE vs. temp table for batch deletes

Erik Darlingweird The performance issue in both queries has nothing to do with CTE vs. temp table. I see there is a timing difference, but hear me out a little bit. just delete In the straight delete, you spend the most time deleting from tables, not selecting from them. The waits in this query are all rela...

 
12:57 PM
Sounds like Cloud Blues
> Regardless, the hardware you're on is incompatible with a production database workload.
 
could be, could be
 
@ErikDarling Sure seems to like heaps with lots of nonclustered indexes. There are eight on the initial table.
I wonder what the PREEMPTIVE_OS_WRITEFILE is all about. Trace? Snapshot database?
WRITE_COMPLETION also suggests a database snapshot
 
The hardware seems reasonably capable otherwise
 
1:12 PM
any cpu will do
4u
 
Yeah idk feels like the waits would be different if it were lakh of memory or v slow disk
Money's currently on one, perhaps many, database snapshots needing to be updated synchronously
 
My merino wool socks arrived today. I'm liking them so far
 
i agree from the pageiolatch_xx waits
sort of
those are also not great
but the writes are particularly bad
 
not awful tho
 
Paul, I was adding OP's last comment on the question. I noticed you deleted several comments but I think (at least the mention of FKs and triggers) might be helpful in the question, since there is no schema.
 
1:16 PM
I'll get around to adding stuff from comments to the question shortly, yes.
Oh, I see you did it for me, thx
It's a cascade though, not a trigger
 
i like how they say they can't post schema's [sic] but every column is in the query plans
clearly they have advanced queue table technology at work here
 
Isitservicebroker.com
 
@ErikDarling You have to remember we're dealing with someone who can't write an EXISTS clause
 
i made that mistake once
ONCE
 
DELETE table WHERE EXISTS (thing_that_exists);
 
1:20 PM
anyway i answered that full expecting to get opped
 
> I forgot to mention our RAM is hosted by S3
 
thumbdrive
 
Maximum number of synchronous AGs
 
D:
"we got this server from glenn berry at auction"
 
🤣🤣🤣
I also wonder why they felt the need to use a CTE or temporary table at all, since they're not making use of an ORDER BY
Oh, they are in the CTE verision
 
1:26 PM
it's sort of like when someone can first legally drink and they go to a bar having no idea what they're doing
i'll take a... martini? do you have the espresso ones?
shot of rum, good sir
speaking of which
 
They'd get a shock if they ran those queries with TF 8790 on for a wide plan
 
i wrote adaptive batch sizing into that loop code
hold my white zin spritzer
 
Erik does Math
 
hey hey we're the monkees
 
sure do like to monkey around
 
1:39 PM
@PaulWhite what other method is there to delete a specific number of rows, besides a CTE or derived table with TOP (n)?
 
@ypercubeᵀᴹ Yes, a DELETE TOP or subquery
 
service broker
with an indexed view
 
Also, a cursor with a loop
 
or a loop without a cursor
 
You might laugh at that, but it can be the best way when you really want the deletion process to back off
 
1:41 PM
ah, you can do DELETE TOP without subquery. I had forgotten that
 
Yeah, just can't specify an ORDER BY
 
a trigger
order by newid()
 
@Zikato Yeah, MERGE does have its upsides
 
1:58 PM
so
what is everyone going to do to have a great weekend
 
Wive is away for the weekend, so solo parenting
 
praying 4u
 
you should go away too
really throw the kids a curveball
 
not too late to come to NYC next week. can your kids fit in a carry-on?
 
wait who's coming to nyc next week
 
2:06 PM
@ErikDarling I'm going to get Conor's old SQL skills blog back up
 
@ErikDarling ✋
 
@PaulWhite how are you planning on doing that
 
some other folx too :p
i'll let them volunteer that info though
 
well
 
@ErikDarling Already done, just asked the pool boy to take care of it
 
2:07 PM
not @Zikato though cause he's like... not into having fun i guess
 
I thought that's what the great weekend reference was about
 
@PeterVandivier if any of these hill folken want to hang out let me know
@PaulWhite no, i hadn't heard anything about it
 
oh most definitely dot gif
 
double bonked for good measure
 
2:08 PM
i think he has me quarantined
 
assuming you're not blocked
 
I wouldn't say it was completely fixed, but it's a lot better than it was
 
well it still has conor's writing on it
 
can't fix that
 
2:14 PM
@ErikDarling Not me. I think Peter replied to a wrong message.
 
obviously not you
 
not me either
unless volcano
 
you should get some tickets just in case
never know when you're gonna have to boogie
 
yeah cos planes would def be ok
I wrote the rough bearing down for the swim jic
knowing my luck I'd end up drifting to a third world country like Chile
shipwrecked on a giant set of eyebrows
2
 
make sure you have your floaties
 
2:21 PM
@PaulWhite What's the callstack?
 
@PaulWhite so mean....at least we don't have this kind of people here
 
well that escalated quickly
 
the eyebrows are to blame
 
darn eyebrows
 
apparently Paul was in that court !
> Te Whatu Ora’s lawyer Paul White told the court that ...
 
2:27 PM
🤯
 
@ypercubeᵀᴹ lol
 
@ErikDarling I still have the floaties you sent me
 
> Te Whatu Ora’s lawyer Paul White told the court that medical professionals have said a child with such a condition would have been treated several weeks ago in normal circumstances; while the parents’ lawyer Sue Grey – another prominent anti-vaccination campaigner – said the parents wanted better care than what the state was offering.
Oh pre-empted by an ypercube
But seriously, you're claiming not to have any antivax nutters in Chile?
 
@ypercubeᵀᴹ your answer is wrong - what if I remove a user from auth?
 
if Chile did have them, they'd be hiding behind giant eyebrows. so how would you even know?
 
2:33 PM
@bbaird what part is wrong?
 
what if I remove a user from auth?
 
what about it?
 
You'll fail due to a FK constraint
It's fun to point out all the ways people can abuse UDFs, but that's not really answering the root of the question which is: "How do you ensure a user is authorized to do something in a manner that doesn't conflict with other things"
IMO (and backed by experience) this is an appropriate use for a UDF/check constraint combo and all the articles you link to won't really apply
 
row level security wouldn't work better here?
 
Sorry, the problem you see is on my suggested solution? With the persisted column and the composite FK?
 
2:36 PM
@PaulWhite they tend to meet some natural circumstances
 
Yes - because you can't remove authorization from a user
 
So if a user is authorised (type 8) and there is a report that references it, you can't remove that user. I think that's the point of FKs.
 
The USER is enforced, but you need the row to exist in auth, not User.
Go into the fiddle, add a user, add type 8 and that user to auth, insert a row into your table, then try to remove the row from auth
This is a temporal constraint - you have to check the user is currently authorized with type 8. Otherwise once you grant type 8 you can never remove it
 
@Lamak Yes, but the poor kid did nothing wrong
I mean, I understand the parents are sincere, but it's still a shame
 
@bbaird if you consider it a temporal constraint, yes, you have a point.
 
2:43 PM
@ypercubeᵀᴹ I've never seen a case where it isn't - hence why the OP is asking the question in the first place.
 
Someone got out of the grumpy side of bed today
 
Am I being grumpy?
 
Little bit
Though I hear tone can be hard to decipher online
@Lamak I suppose it irks me a bit when these people are lucky enough to live where the required treatment is available for free and they're refusing it on the basis of who the blood needed might have come from. Seems a little off.
 
I know I shouldn't have used bold italic, that always comes across hostile.
 
Well, you didn't even say good morning 😀
 
2:47 PM
i write all my invoices in bold italic
 
And red
Comic Sans
 
@bbaird a UDF is still a bad choice in my opinion, even with this consideration.
 
@PaulWhite That's because I haven't had coffee yet - the morning cannot be good until I do so
 
Perhaps there's some way to condense all this feedback on ypercube's solution into something with lasting value. Maybe in a way that allows community feedback and revision history. Helps future visitors to the site.
 
@bbaird Ah, I had a feeling that might be the case
 
2:48 PM
@PaulWhite a little?, it completely off
 
It's on the tip of my tongue.
 
@JoshDarnell An impossible goal
 
There must be some way.
 
Can't think of one, sorry
Better things aren't possible
 
@bbaird new rule for you: no chat until caffeine
 
2:49 PM
@ErikDarling Sending you an invoice for my beans
 
@PaulWhite All is lost.
 
@ErikDarling Sounds like a temporal constraint
 
@bbaird what happens for example (using a UDF as the OP), if we do a logical backup and restore?
 
@PaulWhite perhaps a french constraint
@bbaird i'll cover two beans
 
It's pronounced croissant you oik
 
2:51 PM
i've been to france pal
no one says that
 
I was there first, and they said little else
 
it's more like CUSS-ahn
 
Welcome to "Americans dispensing pronunciation advice"
We have a very special guest today
All the way from Brooklyn, NJ
 
ah put an egg in your jandal
 
did you get it from the trunk of your var-car
@ypercubeᵀᴹ how would that present a problem?
 
2:55 PM
@PaulWhite kiwi geography lessons eh
 
@ErikDarling approximately correct, good enough for a rough bearing sea voyage
 
@PaulWhite if the auth row has been deleted in the meantime, the CHECK constraint would fail validation (I assume that the constraints are checked at restore, aren't they?)
 
@ypercubeᵀᴹ nope, but I fear we may be talking at cross purposes
 
@PaulWhite you'll change your tune when you end up in the pine barrens
 
In SQL Server, one can only backup and restore the database as a unit
(for the purposes of the present discussion anyway)
 
2:58 PM
@PaulWhite you shouldn't call DBAs that anymore
 
@PaulWhite ok, then. I was probably confusing it in my mind, with backup/restores in Postgres where it would be CREATE TABLE + INSERTs, so they would be checked
 
@ErikDarling Perhaps I was thinking of the Sopranos
@ypercubeᵀᴹ Yeah, nah, it's a bulk all-or-nothing operation in SQL Server. The backup is as of a consistent database state, and so is the restore
 
hope you bring enough tic tacs for the missus
 
For some reason, I always imagine you live and work on the set of the Sopranos
 
@JoshDarnell I would but two things 1. the original question is due to a syntax error. 2. 13 people have upvoted an answer that lambasts UDFs and if I say "Hey, yes, you can't use a UDF in this case" what's to say the Anti-UDF League will just downvote or flood the question with comments akin to the chat?
@ErikDarling I've got the "Super Mom" mug filled with my morning latte so I think I'm ready to go
 
3:02 PM
@bbaird Sometimes, it's best not to think about what might happen, and just write the best answer you can.
0
A: How to split a large table in SQL Server

Paul WhitePlan Selection You want to find the top 10 rows by transaction date descending, given a list of one or more users. You already have an index to help find the users, with an included column to provide the join key to the detail table. You were expecting SQL Server to produce a plan that finds user...

For example
I knew that would get no love, but I wrote it anyway
One could also ask the question you wish had been asked, and self-answer that
It's more effort though
 
I was watching Bluey (a kids show set in Australia) with my kids the other day. The characters were putting together a puzzle that was a map of the world, and the kid goes "New Zealand is missing" because the piece wasn't in the box. The dad said, "aw not again" and I thought that was an awesome subtle joke.
3
 
ha ha ha
 
A joke I wouldn't have gotten if not for Paul / this chat room haha.
 
As for the downsides of UDFs in constraints, well there's not really a perfect solution in SQL Server for anything more complex than will fit sensibly in declarative RI. You're going to end up with code in a procedure, trigger, or function. Pretty much a personal choice, just needs to be an informed one.
I tend to disfavour the UDF option because the downsides aren't readily apparent to most people
 
@PaulWhite What are the downsides in doing what amounts to an existence check once upon insert? It'll never run during a select and wouldn't run again unless someone tried to update who authorized the transaction
I agree not to use them in any other instance. They're generally implemented very poorly the way people try to use them.
 
3:12 PM
@bbaird Yes, I'm speaking in generalities, not about the specific example (which I haven't even read deeply). The performance aspect is a big part of it, of course. But there are other things like only ever changing columns referenced by the function, interactions with row-versioning isolation levels etc.
Like anything else, if one is sufficiently expert and can guarantee bad cases won't happen, they're fine
In principle they're not awful. In practice, SQL Server's lamentable implementation for scalar functions makes life considerably more complicated
 
@PaulWhite And you know what answer I'm accepting :P
 
Right 😀
 
I'll think about it later today - just wasted a good portion of my morning playing "What's making my monitor not work? " suspects include: the mini displayport to displayport adapter, the KVM, and the monitor itself.
I gave up and used a HDMI cable
I also have a ton of useless queries to write because the MDM ETL logic is written poorly and failing
 
One advantage of the scalar function is you can use DBCC CHECKCONSTRAINTS
People do bulk inserts after all
 
3:29 PM
I don't think I'd have a UDF on a table where that was a possibility or it would have to be one heck of a data fix to bother with (along with required documentation, testing, etc)
 
Nobody runs DBCC CHECKCONSTRAINTS
 
I never have
People can barely be bothered with using FK constraints
Or writing good procedures
Or not using EF
 
Indeed
Still, I always thought it was a weird default not to fire triggers or check constraints on a bulk load
 
"THat would take to long" -some DWH person, probably
 
Yet other requirements like a table lock need to be explicit
I understand the perf advantage of course, I just would've thought it would need to be explicit
People hate on triggers too, but at least you have the option of properly coding them for multi-row changes
Likewise for a procedure, if you allow a TVP or other way to specify a multi-row source
Even for true OLTP-style single row ops, the UDF overhead becomes significant if you do a lot of ops
It might be different if Microsoft extended function inlining to constraints (and computed columns for that matter), but that seems unlikely at this point.
Perhaps Hekaton supports compiled functions in check constaints, idk offhand
 
3:40 PM
@bbaird ok, you convinced me enough to edit my answer - with some caveat on the specific use case.
 
WHY
Who says Twitter has no sense of humour
 
lol you follow an account named mommy milkers
 
Someone I follow RTd it
 
@PaulWhite sure sure
 
FINE
 
4:05 PM
@ypercubeᵀᴹ Let me know if you'd like some input around use cases - I use the UDF/constraint pattern for exactly two things (existence-type rules and exclusive subtypes). Also worth mentioning how to approach through SP logic.
And I suppose validating status/workflow changes.
 
Yeah, I see the appeal but it still gives me a bad taste. Similar to non-deterministic functions in check constraints and domains, we had a discussion here some weeks ago.
May 11, 2021 at 17:16, by Paul White
CREATE TABLE test (a datetime2 NOT NULL CHECK (a = SYSUTCDATETIME()));
 
@ypercubeᵀᴹ Think of it this way: UDFs are a scalpel. They're a tool. You wouldn't use one to peel potatoes the same way you wouldn't use a vegetable peeler to perform an appendectomy.
A lot of the articles you link to are examples of people trying to use scalpels as peelers, blenders, and remote controls
 
Equally, a vegetable peeler is most often the right tool for the job
Another valid approach is to avoid invalid data entering the database in the first place. Users (including their applications) should not be able to add arbitrary data to tables. They shouldn't even be able to access the tables directly for reading let alone writing.
Which is just the stored procedure approach, I guess.
The idea being, in this case, that if a report entry exists it is because is was definitely authorised at the time it was created, so there's never a need to check it again, whether it remains in the base table or archived off to a history table.
On balance, there are just too many downsides for me to use scalar functions this way.
I suppose the links in the answer already address the lack of parallelism for any operation including that table (including index rebuilds).
 
4:31 PM
Would an index creation or rebuild (that has the column) validate the constraint?
 
No need, because the data exists and isn't changing.
 
so why the lack of paralellism?
 
REASONS
 
I LIKE THAT EXPLANATION ^^
 
1 hour ago, by Paul White
In principle they're not awful. In practice, SQL Server's lamentable implementation for scalar functions makes life considerably more complicated
 
4:33 PM
It's a check on insert and updates of that column - if you're expecting parallelism to help with that... uh
 
@ypercubeᵀᴹ Because SQL Server is overly conservative. Rather than deep dive every instance they just disallowed parallelism in general.
 
Add the caveat of: "no bulk inserts/updates" and you've covered any instance where parallelism would (possibly) be helpful.
 
@bbaird The point is the existence of a scalar function prevents even read queries from using parallelism.
 
@PaulWhite Not in a check constraint
And why would you need your check constraint to do something needing a parallel query? That falls under the vegetable peeler rule.
 
4:46 PM
Someone didn’t read the links 👀👀👀
 
I'm checking against my tables with constraints and I'm not seeing any scans/seeks on the referenced tables on select
@ErikDarling I've read them, I just don't do stupid things
 
Wow.
 
@bbaird aside from the cat?
 
@ErikDarling I still blame my wife for the cat
 
4:53 PM
You have to reference the column with the UDF check constraint on, but it's still a pretty general restriction. Anything that loads metadata for the column will do it.
 
I never intended to lambast UDFs by the way. Only UDFs with subqueries.
 
@PaulWhite I'm not seeing that at all, and I'm trying pretty hard at the moment
 
i believe you're focused on the wrong thing
paul's screenshot shows a parallel plan and then a non-parallel plan when the udf constraint is referenced
in sql server there's a restriction on queries that reference scalar udfs that they can't use a parallel plan. you'll see that when a scalar udf is in the query, or buried in a computed column or check constraint in a table referenced by the query (when the metadata is loaded)
 
USE StackOverflow2010;
GO
CREATE OR ALTER FUNCTION dbo.F (@i integer)
RETURNS integer
AS
BEGIN
    RETURN 1;
END;
GO
-- Parallel
SELECT COUNT_BIG(*)
FROM dbo.Posts AS P
WHERE P.CommentCount > 100;

ALTER TABLE dbo.Posts
    WITH CHECK ADD
        CONSTRAINT CK_CommentCount
            CHECK (dbo.F(CommentCount) = 1);

-- Serial
SELECT COUNT_BIG(*)
FROM dbo.Posts AS P
WHERE P.CommentCount > 100;

ALTER TABLE dbo.Posts
    NOCHECK CONSTRAINT CK_CommentCount;

-- Parallel again
SELECT COUNT_BIG(*)
db<>fiddle doesn't support parallelism, so that's a SO demo
 
how many times have you overwritten a function called "f" good sir
good and lazy sir
 
5:05 PM
Overflowed a bigint
 
saucy
 
It forces me to be tidier
 
Testing again here on a larger table
 
I get an error when I didn't drop the previous function F
 
5:10 PM
Ok, this is totally stupid and I hate SQL Server more than usual
3
 
Good Morning
 
That has to be coincidence
 
I should know better than to question @PaulWhite
 
@bbaird you'd make good friends with the guy pushing for PostgreSQL to outpace SQL Server in popularity in the next few years
 
@bbaird No, you're absolutely right to ask questions and stick to your guns
I have been wrong before
 
5:14 PM
I don't normally see it or care because most of the queries don't use/need parallelism - but I added it to a situation where one could possibly see it (DWH type query) and yes, you're right
 
Again, if you have a workload that never uses parallelism, you're golden
But it's another restriction to add to the list
It's just one that happens to irk me more than most
 
V true and it's dumb SQL Server even looks for a UDF used in a check constraint on a SELECT query
 
Yes, yes it is
I imagine it's done when constraints are loaded in anticipation of being able to use them with implied predicates and contradiction detection
 
So the query engine is just saying "nope" if there's a UDF anywhere - not if the UDF is actually called as part of the operation.
 
5:17 PM
Literally just a flag set as soon as a scalar function appears anywhere in the tree
I suppose you could work around it by making your constraints untrusted, but all rows trusted
So, trusted for old rows, then untrusted, then trusted for all new rows
Way out wacky woo though
 
there's a bunch of reasons for it, too: erikdarlingdata.com/…
some more exciting than others
 
> Generate Valid Blog Post
LOL
Indeed, running my demos on 2022, the reason is TSQLUserDefinedFunctionsNotParallelizable
 
@PaulWhite Or maybe they can just ignore constraints using UDFs from any query planning
 
Now you're dreaming
 
I shouldn't expect common sense from a company that also produced Entity Framework
 
5:22 PM
I suppose they didn't have time for TSQLUserDefinedFunctionFoundButImTooLazyToCheckIfThatsImportantAtAll
How has no one made the Czech constraint reference yet
 
@PaulWhite That would seriously inhibit @Zikato 's ability to create memes
Unless it's czeching that czech = true then it's bad for the rest of us
 
good point
 
Well, they simulated a dumbed down version of one on a quantum computer
But don't let that stop the headline writers
 
it's not a wormhole until you can stick a finger in it
 
5:30 PM
Reminds me of the CERN will create Black Holes! nonsense
 
Total clickbait. Although I saw one article with the headline "Create most trivial and useless wormhole"
 
Grey goo, that was the other one
 
@ErikDarling I'd avoid doing that in the ocean en.wikipedia.org/wiki/Eunice_aphroditois
 
Another link I won't be clicking today
 
"...the bobbit worm stays hidden under tropical sands with just its five antennae poking out—waiting. When it senses prey above, it moves with speed and strength to grab them, sometimes splitting its fishy prey in half with its sharp teeth! It also injects them with a toxin to help break down its food to make it easier to digest."
True nightmare fuel
 
5:39 PM
TIL "cumulative histogram" is a formal "thing" en.wikipedia.org/wiki/Histogram#Cumulative_histogram
> A cumulative histogram is a mapping that counts the cumulative number of observations in all of the bins up to the specified bin
 
@PeterVandivier Y tho. I suppose you could compare that to some CDF or something?
 
did you type that just to make me google "CDF"?
 
cumulative distribution function
integral of the probability density function
 
5:57 PM
 
should probably be pinned to the top of this room at all times
 
Hahaha it does happen a lot.
 
physicists are 2 points, mathematicians 3 ;)
 
Harder to snipe you math people I guess.
 
@JoshDarnell I dunno about that
 
6:23 PM
Does anyone know in what case there's a notable drawback to persisting a computed column as opposed to not persisting (in SQL Server)? I could've sworn I read that once, maybe something Paul wrote somewhere? My mind is blanking...or I'm getting dumber by the day. 😬
I think it was execution plan-ish related. I know you can index non-persisted computed columns and reap the benefits of the index materializing the results. But I thought there was a notable drawback in persisting too for a different scenario.
 
@PeterVandivier Capture da Flag
 
@J.D. In this article, Paul mentions a potential downside to persisted computed columns when you also have TF 176 enabled.
> Note that the expression matching limitation only applies to persisted computed columns when trace flag 176 is active. If we make the computed column indexed but not persisted, expression matching works correctly.
 
Thanks I think that's definitely the article I was thinking of!
 
Number of times I've referred to sql.kiwi/2012/08/temporary-object-caching-explained.html = 9001
 
6:42 PM
Yeah me too
The more obvious downside to adding a persisted computed column to an existing table is it might result in a lot of page splitting or forwarded records, along with heaps of log
 
I used to drive past this place when I would canoe on the Potomac - never got to see inside (DOD stuff, ya know) so it's cool to finally see it: youtube.com/watch?v=pir_muTzYM8
 
@PaulWhite lahkin and blahkin too, while we're pronouncing our greevinzes
 
7:27 PM
@PaulWhite word up, thanks!
 
8:27 PM
heh, not only Japan reversed the game from 0-1 to 2-1 against Spain, Costa Rica scored against Germany as well.
Things are not going well for the Germans
oh boy, Costa Rica - Germany is 2-1 now!
 
@ypercubeᵀᴹ it’s been a bad 100 years for them yeah
 
2-2 now, they still have some chances but it's not entirely up to them
it depends on the Japan-Spain game as well
 
Poland squeaked through I saw
 
yeah, both lost to Argentina 0-2 and they won Saudi Arabia but Poland did with 2-0, Mexico with 2-1.
It was the 1 goal diff that let them through
and now Germany is back on top. 3-2
so they now have to bribe Spain to equalize Japan
 
8:48 PM
4-2 now
 
it's over now.
 
00:00 - 21:0021:00 - 00:00

« first day (4349 days earlier)      last day (511 days later) »