Always looking for ways to increase the entertainment value of the site, I came up with this idea last night.
Countdown PL/SQL
You have thirty seconds to answer ten true-false questions.
With the clock on the page counting down, you are shown a statement about PL/SQL and you must quickly decide: true or false.
Of course, the same could be done with SQL, APEX, etc.
One concern I could see with this quiz is that comfort with the English language could have a big impact on how quickly you can get through the questions. It is also possible that we could offer versions that contained code, not (mostly) words.
Perhaps it is time to look at localization of content: offer it in different languages!
So what do you think? Sound interesting? Sound like something you'd bother playing?
21 March 2014
17 March 2014
Q2 2014 Brings Big Changes to the PL/SQL Challenge
Last year, I (Steven Feuerstein) floated the idea that I would end the daily PL/SQL quiz. Many players protested, and several agreed to help me with the workload by writing quizzes. So I agreed to keep the daily quiz going into 2014 and we would see how it goes.
It went pretty well. Some players did write quizzes (a big thank you most especially to Jeroen Rutte, who wrote a total of 7 quizzes, 5 of which were used in Q1). But I still spent and spend lots of time writing quizzes, which I enjoy greatly, but unfortunately is not sustainable.
So starting in Q2 2014, the daily PL/SQL quiz will end and in its place we will offer three weekly quizzes in its place:
PL/SQL Challenge
The PL/SQL Challenge replaces the daily PL/SQL quiz that ran from April 2010 through March 2014. I will write all the quizzes for the PL/SQL Challenge quiz. They will focus on "core" PL/SQL features (including commonly-used supplied packages like DBMS_OUTPUT and UTL_FILE), up through the latest production version of the Oracle database. Players who take this quiz are eligible to qualify for the annual PL/SQL Challenge Championship.[We may decide to increase the frequency of those championships, but for now: annual.]
PL/SQL Explore
The PL/SQL Explore quiz explores the nooks and crannies of the PL/SQL language, and the many PL/SQL packages supplied by Oracle Corporation. Quizzes are provided by both Steven Feuerstein and players, and can range from "core" PL/SQL functionality to "edgy" elements of the language, like calling Java from PL/SQ or rarely used supplied packages. like DBMS_XA.
PL/SQL Deja Vu
PL/SQL Deja Vu offers quizzes from the past - PL/SQL quizzes previously played on the daily PL/SQL quiz or one of the other PL/SQL quizzes. Use Deja Vu PL/SQL to reinforce your PL/SQL knowledge without worrying about competing with others. These quizzes are not ranked!
We will also "re-brand" the daily PL/SQL quiz to the "PL/SQL Challenge", so the daily quiz names will be of this form:
PL/SQL Challenge #276 D2011-04-12
and the weekly PL/SQL Challenge quiz names will look like:
PL/SQL Challenge #1240 WS2013-04-12
where "WS" is the "Weekly quiz Starting on".
We will look into ways to offer rankings across the various competitive PL/SQL quizzes, but we will not be able to get to that immediately.
Of course, the new quarter has not yet started. I am very interested to hear your feedback on these quizzes.
And, of course, you are welcome to shower me with flattery about how much you love those daily quizzes and want them to continue. Surely, my ego could use the stroking. :-)
But this time the decision is made: the daily quiz will end, and three new PL/SQL weekly quizzes will take its place.
It went pretty well. Some players did write quizzes (a big thank you most especially to Jeroen Rutte, who wrote a total of 7 quizzes, 5 of which were used in Q1). But I still spent and spend lots of time writing quizzes, which I enjoy greatly, but unfortunately is not sustainable.
So starting in Q2 2014, the daily PL/SQL quiz will end and in its place we will offer three weekly quizzes in its place:
PL/SQL Challenge
The PL/SQL Challenge replaces the daily PL/SQL quiz that ran from April 2010 through March 2014. I will write all the quizzes for the PL/SQL Challenge quiz. They will focus on "core" PL/SQL features (including commonly-used supplied packages like DBMS_OUTPUT and UTL_FILE), up through the latest production version of the Oracle database. Players who take this quiz are eligible to qualify for the annual PL/SQL Challenge Championship.[We may decide to increase the frequency of those championships, but for now: annual.]
PL/SQL Explore
The PL/SQL Explore quiz explores the nooks and crannies of the PL/SQL language, and the many PL/SQL packages supplied by Oracle Corporation. Quizzes are provided by both Steven Feuerstein and players, and can range from "core" PL/SQL functionality to "edgy" elements of the language, like calling Java from PL/SQ or rarely used supplied packages. like DBMS_XA.
PL/SQL Deja Vu
PL/SQL Deja Vu offers quizzes from the past - PL/SQL quizzes previously played on the daily PL/SQL quiz or one of the other PL/SQL quizzes. Use Deja Vu PL/SQL to reinforce your PL/SQL knowledge without worrying about competing with others. These quizzes are not ranked!
We will also "re-brand" the daily PL/SQL quiz to the "PL/SQL Challenge", so the daily quiz names will be of this form:
PL/SQL Challenge #276 D2011-04-12
and the weekly PL/SQL Challenge quiz names will look like:
PL/SQL Challenge #1240 WS2013-04-12
where "WS" is the "Weekly quiz Starting on".
We will look into ways to offer rankings across the various competitive PL/SQL quizzes, but we will not be able to get to that immediately.
Of course, the new quarter has not yet started. I am very interested to hear your feedback on these quizzes.
And, of course, you are welcome to shower me with flattery about how much you love those daily quizzes and want them to continue. Surely, my ego could use the stroking. :-)
But this time the decision is made: the daily quiz will end, and three new PL/SQL weekly quizzes will take its place.
10 March 2014
Results of 2013 Q4 PL/SQL Championship
You will find below the rankings for the 2013 Q4 PL/SQL championship; the number next to the player's name is the number of times that player has participated in a championship.
Congratulations first and foremost to our top-ranked players:
1st Place: Peter Auer of Germany
2nd Place: Mike Pargeter of United Kingdom
3rd Place: Frank Schmitt of Germany
This was Peter's first championship. An impressive rookie performance, Peter!
Next, congratulations to everyone who played in the championship. I hope you found it entertaining, challenging and educational. And for those who were not able to participate in the championship, you can take the quizzes next week through the Practice feature. We will also make the championship as a whole available as a Test, so you can take it just like these players did.
My thanks to all my fine reviewers, but most particularly Elic, whose impact on the quality of our daily quizzes and championships cannot be overstated.
Steven Feuerstein
Note: Below the table of results for this championship, you will find another list showing the championship history of each of these players.
Congratulations first and foremost to our top-ranked players:
1st Place: Peter Auer of Germany
2nd Place: Mike Pargeter of United Kingdom
3rd Place: Frank Schmitt of Germany
This was Peter's first championship. An impressive rookie performance, Peter!
Next, congratulations to everyone who played in the championship. I hope you found it entertaining, challenging and educational. And for those who were not able to participate in the championship, you can take the quizzes next week through the Practice feature. We will also make the championship as a whole available as a Test, so you can take it just like these players did.
My thanks to all my fine reviewers, but most particularly Elic, whose impact on the quality of our daily quizzes and championships cannot be overstated.
Steven Feuerstein
Note: Below the table of results for this championship, you will find another list showing the championship history of each of these players.
| Rank | Name | Country | Total Time | % Correct | Total Score |
|---|---|---|---|---|---|
| 1 | Peter Auer (1) | Germany | 27 mins 25 secs | 92% | 2882 |
| 2 | Mike Pargeter (12) | United Kingdom | 22 mins 06 secs | 87% | 2788 |
| 3 | Frank Schmitt (8) | Germany | 30 mins 05 secs | 87% | 2723 |
| 4 | Karel Prech (3) | Czech Republic | 32 mins 25 secs | 87% | 2652 |
| 5 | Michal Cvan (11) | Slovakia | 33 mins 58 secs | 87% | 2551 |
| 6 | Zoltan Fulop (7) | Hungary | 29 mins 14 secs | 82% | 2485 |
| 7 | Janis Baiza (9) | Latvia | 22 mins 35 secs | 76% | 2443 |
| 8 | Jerry Bull (11) | United States | 29 mins 20 secs | 74% | 2443 |
| 9 | Ravshan Abbasov (1) | Uzbekistan | 33 mins 11 secs | 79% | 2441 |
| 10 | Anna Onishchuk (8) | Ireland | 16 mins 40 secs | 79% | 2432 |
| 11 | dmitrysk (1) | Russia | 32 mins 52 secs | 84% | 2398 |
| 12 | Manfred Kleander (1) | Austria | 34 mins 52 secs | 84% | 2393 |
| 13 | Vincent Malgrat (7) | French Republic | 32 mins 35 secs | 79% | 2388 |
| 14 | Lukasz Kubicki (1) | Poland | 22 mins 54 secs | 71% | 2362 |
| 15 | james su (8) | Canada | 21 mins 52 secs | 71% | 2348 |
| 16 | Chad Lee (10) | United States | 33 mins 00 secs | 84% | 2325 |
| 17 | Jeroen Rutte (7) | Netherlands | 34 mins 46 secs | 82% | 2320 |
| 18 | Frank Puechl (4) | Germany | 20 mins 50 secs | 74% | 2298 |
| 19 | Rytis Budreika (1) | Lithuania | 18 mins 20 secs | 68% | 2253 |
| 20 | mentzel.iudith (13) | Israel | 33 mins 13 secs | 84% | 2251 |
| 21 | João Barreto (4) | Portugal | 22 mins 17 secs | 74% | 2214 |
| 22 | Telmoc (2) | Portugal | 20 mins 30 secs | 66% | 2190 |
| 23 | Randy Gettman (12) | United States | 34 mins 52 secs | 71% | 2183 |
| 24 | Yuri Pedan (4) | Ukraine | 17 mins 06 secs | 71% | 2163 |
| 25 | Viacheslav Stepanov (12) | Russia | 31 mins 00 secs | 76% | 2145 |
| 26 | Krzysztof Helbin (3) | Poland | 26 mins 08 secs | 68% | 2112 |
| 27 | Anil Jha (3) | United States | 34 mins 56 secs | 76% | 2101 |
| 28 | Kevan Gelling (9) | Isle of Man | 30 mins 37 secs | 68% | 2078 |
| 29 | Siim Kask (13) | Estonia | 27 mins 48 secs | 63% | 2054 |
| 30 | Leszek Grudzień (2) | Poland | 30 mins 20 secs | 66% | 1998 |
| 31 | Yuan Tschang (8) | United States | 34 mins 24 secs | 55% | 1972 |
| 32 | Niels Hecker (14) | Germany | 35 mins 00 secs | 71% | 1960 |
| 33 | Oleksiy Varchyn (2) | Norway | 21 mins 32 secs | 61% | 1919 |
| 34 | _tiki_4_ (6) | Germany | 25 mins 06 secs | 58% | 1678 |
| 35 | Goran Stefanović (5) | Serbia | 24 mins 33 secs | 61% | 1544 |
| 36 | Rakesh Dadhich (5) | India | 26 mins 50 secs | 55% | 1443 |
| 37 | Stelios Vlasopoulos (10) | Belgium | 24 mins 13 secs | 50% | 1406 |
| 38 | Thierry Poels (7) | Belgium | 28 mins 05 secs | 58% | 1343 |
| 39 | Milibor Jovanovic (5) | Serbia | 32 mins 24 secs | 53% | 1272 |
| 40 | Dan Kiser (6) | United States | 33 mins 38 secs | 50% | 897 |
Championship Performance History
After each name, the quarter in which he or she played, and the ranking in that championship.| Name | History |
|---|---|
| Peter Auer | Q4 2013:1st |
| Mike Pargeter | Q4 2010:22nd, Q1 2011:15th, Q2 2011:8th, Q4 2011:5th, Q1 2012:5th, Q2 2012:17th, Q3 2012:5th, Q4 2012:20th, Q2 2013:12th, Q4 2013:2nd |
| Frank Schmitt | Q4 2011:22nd, Q2 2012:2nd, Q3 2012:21st, Q4 2012:3rd, Q1 2013:13th, Q2 2013:1st, Q3 2013:9th, Q4 2013:3rd |
| Karel Prech | Q3 2012:36th, Q4 2012:23rd, Q4 2013:4th |
| Michal Cvan | Q3 2010:22nd, Q4 2010:25th, Q3 2011:21st, Q1 2012:11th, Q3 2012:14th, Q4 2012:14th, Q1 2013:14th, Q2 2013:11th, Q3 2013:1st, Q4 2013:5th |
| Zoltan Fulop | Q1 2012:15th, Q2 2012:26th, Q3 2012:22nd, Q4 2012:17th, Q1 2013:22nd, Q3 2013:22nd, Q4 2013:6th |
| Janis Baiza | Q2 2010:3rd, Q4 2010:7th, Q3 2011:9th, Q4 2011:1st, Q3 2012:23rd, Q1 2013:4th, Q2 2013:4th, Q3 2013:3rd, Q4 2013:7th |
| Jerry Bull | Q2 2011:32nd, Q3 2011:8th, Q1 2012:12th, Q2 2012:11th, Q3 2012:13th, Q4 2012:15th, Q1 2013:9th, Q2 2013:15th, Q4 2013:8th |
| Ravshan Abbasov | Q4 2013:9th |
| Anna Onishchuk | Q1 2011:5th, Q2 2011:20th, Q3 2011:19th, Q4 2011:17th, Q1 2012:21st, Q2 2012:8th, Q4 2013:10th |
| dmitrysk | Q4 2013:11th |
| Manfred Kleander | Q4 2013:12th |
| Vincent Malgrat | Q4 2011:9th, Q1 2012:13th, Q2 2012:13th, Q4 2012:6th, Q1 2013:1st, Q2 2013:14th, Q4 2013:13th |
| Lukasz Kubicki | Q4 2013:14th |
| james su | Q3 2010:56th, Q2 2011:7th, Q3 2011:11th, Q4 2011:14th, Q2 2012:15th, Q1 2013:7th, Q3 2013:15th, Q4 2013:15th |
| Chad Lee | Q2 2011:26th, Q3 2011:17th, Q4 2011:12th, Q1 2012:1st, Q2 2012:23rd, Q3 2012:28th, Q4 2012:22nd, Q1 2013:20th, Q2 2013:8th, Q4 2013:16th |
| Jeroen Rutte | Q3 2010:19th, Q3 2012:10th, Q4 2012:11th, Q1 2013:8th, Q2 2013:18th, Q3 2013:4th, Q4 2013:17th |
| Frank Puechl | Q3 2012:26th, Q1 2013:15th, Q3 2013:12th, Q4 2013:18th |
| Rytis Budreika | Q4 2013:19th |
| mentzel.iudith | Q4 2010:4th, Q1 2011:17th, Q2 2011:23rd, Q3 2011:5th, Q4 2011:4th, Q1 2012:7th, Q2 2012:16th, Q3 2012:33rd, Q4 2012:4th, Q1 2013:2nd, Q2 2013:7th, Q3 2013:2nd, Q4 2013:20th |
| João Barreto | Q3 2010:18th, Q4 2010:21st, Q2 2011:3rd, Q4 2013:21st |
| Telmoc | Q4 2013:22nd |
| Randy Gettman | Q3 2010:8th, Q1 2011:25th, Q2 2011:10th, Q3 2011:3rd, Q4 2011:11th, Q1 2012:18th, Q2 2012:19th, Q3 2012:30th, Q4 2012:12th, Q1 2013:3rd, Q2 2013:13th, Q4 2013:23rd |
| Yuri Pedan | Q3 2010:45th, Q4 2010:9th, Q1 2011:2nd, Q4 2013:24th |
| Viacheslav Stepanov | Q1 2011:8th, Q2 2011:4th, Q3 2011:13th, Q4 2011:19th, Q1 2012:17th, Q2 2012:9th, Q3 2012:6th, Q4 2012:21st, Q1 2013:18th, Q2 2013:22nd, Q3 2013:11th, Q4 2013:25th |
| Krzysztof Helbin | Q1 2012:10th, Q4 2012:18th, Q4 2013:26th |
| Anil Jha | Q2 2012:28th, Q4 2012:19th, Q4 2013:27th |
| Kevan Gelling | Q2 2011:19th, Q3 2011:1st, Q4 2011:6th, Q1 2012:6th, Q2 2012:22nd, Q4 2012:16th, Q1 2013:12th, Q4 2013:28th |
| Siim Kask | Q1 2011:28th, Q2 2011:6th, Q3 2011:10th, Q4 2011:3rd, Q1 2012:8th, Q2 2012:4th, Q3 2012:31st, Q4 2012:10th, Q1 2013:11th, Q2 2013:16th, Q3 2013:17th, Q4 2013:29th |
| Leszek Grudzień | Q2 2013:24th, Q4 2013:30th |
| Yuan Tschang | Q2 2012:24th, Q3 2012:24th, Q4 2012:27th, Q2 2013:30th, Q4 2013:31st |
| Niels Hecker | Q2 2010:2nd, Q3 2010:1st, Q4 2010:15th, Q1 2011:6th, Q3 2011:7th, Q4 2011:10th, Q1 2012:2nd, Q2 2012:3rd, Q3 2012:2nd, Q4 2012:7th, Q1 2013:6th, Q2 2013:3rd, Q3 2013:13th, Q4 2013:32nd |
| Oleksiy Varchyn | Q3 2013:28th, Q4 2013:33rd |
| _tiki_4_ | Q4 2011:26th, Q1 2012:16th, Q2 2012:20th, Q4 2012:8th, Q3 2013:8th, Q4 2013:34th |
| Goran Stefanović | Q1 2012:31st, Q2 2012:27th, Q3 2012:34th, Q4 2013:35th |
| Rakesh Dadhich | Q2 2012:10th, Q1 2013:23rd, Q2 2013:28th, Q3 2013:27th, Q4 2013:36th |
| Stelios Vlasopoulos | Q4 2010:37th, Q4 2011:20th, Q1 2012:27th, Q2 2012:30th, Q3 2012:1st, Q4 2012:1st, Q1 2013:27th, Q2 2013:23rd, Q3 2013:19th, Q4 2013:37th |
| Thierry Poels | Q3 2011:22nd, Q1 2012:24th, Q1 2013:26th, Q3 2013:25th, Q4 2013:38th |
| Milibor Jovanovic | Q4 2012:29th, Q1 2013:30th, Q3 2013:18th, Q4 2013:39th |
| Dan Kiser | Q4 2013:40th |
26 February 2014
Results of First Annual Logic Championship (2013)
You will find below the rankings for the first ever 2013 Logic championship.
Congratulations first and foremost to our top-ranked players:
1st Place: Viacheslav Stepanov of Russia
2nd Place: Jerry Bull of United States
3rd Place: Niels Hecker of Germany
Next, congratulations to everyone who played in the championship. I hope you found it entertaining, challenging and educational. And for those who were not able to participate in the championship, you can take the quizzes next week through the Practice feature. We will also make the championship as a whole available as a Test, so you can take it just like these players did.
Steven Feuerstein
Congratulations first and foremost to our top-ranked players:
1st Place: Viacheslav Stepanov of Russia
2nd Place: Jerry Bull of United States
3rd Place: Niels Hecker of Germany
Next, congratulations to everyone who played in the championship. I hope you found it entertaining, challenging and educational. And for those who were not able to participate in the championship, you can take the quizzes next week through the Practice feature. We will also make the championship as a whole available as a Test, so you can take it just like these players did.
Steven Feuerstein
| Rank | Name | Country | Total Time | % Correct | Total Score |
|---|---|---|---|---|---|
| 1 | Viacheslav Stepanov (1) | Russia | 20 mins 50 secs | 90% | 3033 |
| 2 | Jerry Bull (1) | United States | 14 mins 48 secs | 76% | 2634 |
| 3 | Niels Hecker (1) | Germany | 37 mins 57 secs | 81% | 2356 |
| 4 | mentzel.iudith (1) | Israel | 59 mins 50 secs | 90% | 2253 |
| 5 | Ingimundur Gudmundsson (1) | Norway | 34 mins 27 secs | 71% | 2051 |
| 6 | Zoltan Fulop (1) | Hungary | 43 mins 38 secs | 76% | 2017 |
| 7 | Dan Jankowski (1) | United States | 19 mins 58 secs | 62% | 1966 |
| 8 | Lieselotje (1) | Belgium | 47 mins 08 secs | 76% | 1947 |
| 9 | Hudai Polat (1) | Turkey | 21 mins 25 secs | 62% | 1902 |
| 10 | MarkM. (1) | Germany | 59 mins 40 secs | 81% | 1847 |
| 11 | Randy Gettman (1) | United States | 58 mins 17 secs | 81% | 1839 |
| 12 | Rytis Budreika (1) | Lithuania | 09 mins 33 secs | 52% | 1804 |
| 13 | Elic (1) | Belarus | 56 mins 49 secs | 76% | 1754 |
| 14 | Jason H (1) | United States | 22 mins 30 secs | 57% | 1730 |
| 15 | Andres (1) | Estonia | 58 mins 51 secs | 76% | 1713 |
| 16 | Stelios Vlasopoulos (1) | Belgium | 57 mins 43 secs | 76% | 1701 |
| 17 | Sandra99 (1) | Italy | 41 mins 56 secs | 67% | 1681 |
| 18 | Christoph Hillinger (1) | Austria | 59 mins 11 secs | 76% | 1636 |
| 19 | Chris Saxon (1) | United Kingdom | 34 mins 11 secs | 62% | 1606 |
| 20 | Cristinel Boboc (1) | Romania | 47 mins 33 secs | 67% | 1604 |
| 21 | katuinbouter (1) | Netherlands | 55 mins 59 secs | 71% | 1585 |
| 22 | PZOL (1) | Hungary | 37 mins 58 secs | 62% | 1566 |
| 23 | Yuan Tschang (1) | United States | 55 mins 14 secs | 71% | 1560 |
| 24 | danad (1) | Czech Republic | 31 mins 09 secs | 57% | 1517 |
| 25 | Sean Molloy (1) | United States | 54 mins 40 secs | 67% | 1462 |
| 26 | Tony Winn (1) | Australia | 52 mins 56 secs | 67% | 1386 |
| 27 | Mihail Siscu (1) | Moldova | 58 mins 35 secs | 67% | 1383 |
| 28 | Peter Chenery (1) | United Kingdom | 44 mins 42 secs | 57% | 1361 |
| 29 | Enrico Rebecchi (1) | Italy | 59 mins 30 secs | 67% | 1325 |
| 30 | tonyC (1) | United Kingdom | 52 mins 29 secs | 57% | 1130 |
| 31 | Mehrab (1) | United Kingdom | 56 mins 38 secs | 57% | 1082 |
| 32 | Rich Dellheim (1) | United States | 53 mins 53 secs | 52% | 952 |
| 33 | macabre (1) | Russia | 41 mins 27 secs | 48% | 936 |
| 34 | Milibor Jovanovic (1) | Serbia | 58 mins 13 secs | 52% | 791 |
| 35 | Chad Lee (1) | United States | 48 mins 28 secs | 38% | 461 |
| 36 | JasonC (1) | United Kingdom | 58 mins 14 secs | 33% | 264 |
17 February 2014
A Glimpse into Feuerstein Refactoring....End Result Better?
As some of you may recall, we held our first non-PLSQL and non-quarterly championship since the PL/SQL Challenge started: the 12 February Annual SQL Championship.
Now, of course, if I had designed my database without any flaws, fully taking into account all possible directions in which the website could go, anticipating all possible user requests, etc., then we would not have encountered any bugs in the process of applying our code base to this new championship.
Ha. Ha. Ha.
We found many, many bugs, ranging from drawbacks in the design (worst, deepest impact, etc.) to ridiculous examples of hard-coding (the PL/SQL Championship competition_id = 2. So, sure, you could find "2"s in my code. What can I say? At least I admit it. Perhaps this is my own personal form of confessional therapy: dumping all this on you!).
So we did lots of work before the championship was held, and our efforts paid off with an error-free competition (well....not quite. With all players starting at the same time, there was a noticeable delay and some timeouts right at the beginning, but then it all settled down).
But then it was time to report on the results, award prizes, generate certificates, display results on the Quiz Details page....and we found many more bugs!
One of the steps we'd taken previously was to build in much more flexibility about specifying how and when players can see results. So now each competition event (daily quiz, championship, etc.) has a section that looks like (these are the settings for a championship):
But of course I then needed to write the code that would correctly combine these settings with the "state of play" and do the right thing.
It was hard for me to sort out all the logic, but I pushed my way through it, did some testing, seemed OK. And then I (deep shame) copy/pasted it for another function that had slightly different settings. I said to myself: "You have got to refactor this." to which I replied, "Yeah, right, will do. Someday."
You will find the code below. Feel free to read it, of course, but here's my overall take on it: besides the obvious awfulness of the copied code, those complex Boolean expressions are really, really difficult to understand and maintain. In trying to fix a problem right after the playoff, I introduced two more by getting mixed up on AND vs OR and where the parentheses should go.
Oh and then there are the comments:
"/* 2.5 I do not see what this will do. */"
and"
/* 2.5 I do not see what value this adds.*/".
Real confidence builders! So like I say, feel free to check out this code, but what I mostly want to do is show you the refactored version and do a little reality check with anyone who wants to take the time: Is it easier to read? Do you think it was worth doing? Do you see a better way to do this?
And yes, sure, I should provide more of an explanation to what is going on here, but:
a. I don't have the time, and
b. I "pride" myself on writing self-documenting code. In other words, I am too lazy to write comments.
Thanks! Steven Feuerstein
Original UGLY Code
The Refactored Code
Now, of course, if I had designed my database without any flaws, fully taking into account all possible directions in which the website could go, anticipating all possible user requests, etc., then we would not have encountered any bugs in the process of applying our code base to this new championship.
Ha. Ha. Ha.
We found many, many bugs, ranging from drawbacks in the design (worst, deepest impact, etc.) to ridiculous examples of hard-coding (the PL/SQL Championship competition_id = 2. So, sure, you could find "2"s in my code. What can I say? At least I admit it. Perhaps this is my own personal form of confessional therapy: dumping all this on you!).
So we did lots of work before the championship was held, and our efforts paid off with an error-free competition (well....not quite. With all players starting at the same time, there was a noticeable delay and some timeouts right at the beginning, but then it all settled down).
But then it was time to report on the results, award prizes, generate certificates, display results on the Quiz Details page....and we found many more bugs!
One of the steps we'd taken previously was to build in much more flexibility about specifying how and when players can see results. So now each competition event (daily quiz, championship, etc.) has a section that looks like (these are the settings for a championship):
But of course I then needed to write the code that would correctly combine these settings with the "state of play" and do the right thing.
It was hard for me to sort out all the logic, but I pushed my way through it, did some testing, seemed OK. And then I (deep shame) copy/pasted it for another function that had slightly different settings. I said to myself: "You have got to refactor this." to which I replied, "Yeah, right, will do. Someday."
You will find the code below. Feel free to read it, of course, but here's my overall take on it: besides the obvious awfulness of the copied code, those complex Boolean expressions are really, really difficult to understand and maintain. In trying to fix a problem right after the playoff, I introduced two more by getting mixed up on AND vs OR and where the parentheses should go.
Oh and then there are the comments:
"/* 2.5 I do not see what this will do. */"
and"
/* 2.5 I do not see what value this adds.*/".
Real confidence builders! So like I say, feel free to check out this code, but what I mostly want to do is show you the refactored version and do a little reality check with anyone who wants to take the time: Is it easier to read? Do you think it was worth doing? Do you see a better way to do this?
And yes, sure, I should provide more of an explanation to what is going on here, but:
a. I don't have the time, and
b. I "pride" myself on writing self-documenting code. In other words, I am too lazy to write comments.
Thanks! Steven Feuerstein
Original UGLY Code
FUNCTION results_available_for (comp_event_id_in IN INTEGER,
user_id_in IN INTEGER)
RETURN BOOLEAN
IS
c_user_id CONSTANT INTEGER
:= NVL (user_id_in, qdb_user_mgr.guest_user_id) ;
c_can_play CONSTANT BOOLEAN
:= can_play (comp_event_id_in, user_id_in) ;
l_comp_event qdb_comp_events%ROWTYPE;
l_competition qdb_competitions%ROWTYPE;
l_return BOOLEAN := FALSE;
BEGIN
/* Might be null from reviewer */
IF comp_event_id_in IS NOT NULL
THEN
l_comp_event := qdb_comp_event_mgr.one_comp_event (comp_event_id_in);
l_competition :=
qdb_comp_event_mgr.competition_for_comp_event (comp_event_id_in);
IF qdb_utilities.trace_is_on
THEN
qdb_utilities.trace_activity (
'results_available_for sra-pas-sa',
l_comp_event.pl_see_results_after
|| '-'
|| l_competition.players_accept_scores
|| '-'
|| l_comp_event.scores_accepted);
END IF;
/* Precedence to access: ANSWERED CLOSED RANKED */
l_return :=
CASE /* Can always see results of "Solve Problem" quiz */
WHEN qdb_content.free_form_question (
qdb_quiz_mgr.single_question_id_for_compev (
comp_event_id_in))
THEN
TRUE /* If answered, then can view if results are available after
answered or scores have been accepted. */
WHEN ex_u_qdb_compev_answers (comp_event_id_in, c_user_id)
THEN
( (l_comp_event.pl_see_results_after =
qdb_competition_mgr.c_resavail_answered)
OR ( l_comp_event.pl_see_results_after =
qdb_competition_mgr.c_resavail_closed
AND l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_closed)
OR ( l_comp_event.pl_see_results_after =
qdb_competition_mgr.c_resavail_ranked
AND ( l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_ranked
OR ( l_comp_event.ignore_results =
qdb_config.c_yes
AND l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_closed))))
or ( l_comp_event.pl_see_results_after =
qdb_competition_mgr.c_quiz_accepted
AND ( l_competition.players_accept_quizzes =
qdb_config.c_no
OR ( l_competition.players_accept_quizzes =
qdb_config.c_yes
AND l_comp_event.quizzes_accepted =
qdb_config.c_yes)))
/* Not answered but could play...can only see if closed/ranked*/
WHEN c_can_play
THEN
l_comp_event.comp_event_status IN (qdb_competition_mgr.c_compev_ranked,
qdb_competition_mgr.c_compev_closed)
/* Not a player - what can everyone see? */
WHEN comp_event_closed_for_user (comp_event_id_in, c_user_id)
THEN
( l_comp_event.ev_see_results_after =
qdb_competition_mgr.c_resavail_closed
AND l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_closed)
OR ( l_comp_event.ev_see_results_after =
qdb_competition_mgr.c_resavail_ranked
AND ( l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_ranked
OR ( l_comp_event.ignore_results =
qdb_config.c_yes
AND l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_closed)))
/* 2.5 I do not see what value this adds. */
/* Can you see it when it's ranked */
WHEN l_comp_event.pl_see_results_after IN (qdb_competition_mgr.c_resavail_closed,
qdb_competition_mgr.c_resavail_answered,
qdb_competition_mgr.c_resavail_ranked)
AND l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_ranked
THEN
TRUE
ELSE
FALSE
END;
END IF;
RETURN l_return;
END results_available_for;
FUNCTION results_available_for_sql (comp_event_id_in IN INTEGER,
user_id_in IN INTEGER)
RETURN PLS_INTEGER
IS
BEGIN
RETURN CASE
WHEN results_available_for (comp_event_id_in, user_id_in)
THEN
1
ELSE
0
END;
END;
FUNCTION can_see_quiz (comp_event_id_in IN INTEGER, user_id_in IN INTEGER)
RETURN BOOLEAN
IS
c_user_id CONSTANT INTEGER
:= NVL (user_id_in, qdb_user_mgr.guest_user_id) ;
c_can_play CONSTANT BOOLEAN
:= can_play (comp_event_id_in, user_id_in) ;
l_comp_event qdb_comp_events%ROWTYPE;
l_competition qdb_competitions%ROWTYPE;
l_return BOOLEAN := FALSE;
BEGIN
/* Might be null from reviewer */
IF comp_event_id_in IS NOT NULL
THEN
l_comp_event := qdb_comp_event_mgr.one_comp_event (comp_event_id_in);
l_competition :=
qdb_comp_event_mgr.competition_for_comp_event (comp_event_id_in);
IF qdb_utilities.trace_is_on
THEN
qdb_utilities.trace_activity (
'can_see_quiz sqa-pas-sa',
l_competition.pl_see_quiz_after
|| '-'
|| l_competition.players_accept_quizzes
|| '-'
|| l_comp_event.quizzes_accepted);
END IF;
/* if played, quizzes are accepted and can see after quiz taken. */
/* Precedence to access: ANSWERED CLOSED RANKED */
l_return :=
CASE
WHEN qdb_content.free_form_question (
qdb_quiz_mgr.single_question_id_for_compev (
comp_event_id_in))
THEN
/* Can always see results of "Solve Problem" quiz */
TRUE
WHEN ex_u_qdb_compev_answers (comp_event_id_in, c_user_id)
THEN
/* If answered, then can view if results are available after
answered or quizzes have been accepted. */
( (l_comp_event.pl_see_quiz_after =
qdb_competition_mgr.c_resavail_answered)
OR ( l_comp_event.pl_see_quiz_after =
qdb_competition_mgr.c_resavail_closed
AND l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_closed)
OR ( l_comp_event.ev_see_results_after =
qdb_competition_mgr.c_resavail_ranked
AND ( l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_ranked
OR ( l_comp_event.ignore_results =
qdb_config.c_yes
AND l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_closed))))
WHEN c_can_play
THEN
/* Not answered but could play...can only see if closed/ranked*/
l_comp_event.comp_event_status IN (qdb_competition_mgr.c_compev_ranked,
qdb_competition_mgr.c_compev_closed)
WHEN comp_event_closed_for_user (comp_event_id_in, c_user_id)
THEN
/* Not a player - what can everyone see? */
( l_comp_event.ev_see_quiz_after =
qdb_competition_mgr.c_resavail_closed
AND l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_closed)
OR ( l_comp_event.ev_see_results_after =
qdb_competition_mgr.c_resavail_ranked
AND ( l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_ranked
OR ( l_comp_event.ignore_results =
qdb_config.c_yes
AND l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_closed)))
WHEN l_comp_event.pl_see_quiz_after IN (qdb_competition_mgr.c_resavail_closed,
qdb_competition_mgr.c_resavail_answered,
qdb_competition_mgr.c_resavail_ranked)
AND l_comp_event.comp_event_status =
qdb_competition_mgr.c_compev_ranked
THEN
/* 2.5 I do not see what this will do. */
/* Can you see it when it's ranked */
TRUE
ELSE
FALSE
END;
END IF;
RETURN l_return;
END;
The Refactored Code
FUNCTION can_show_information (
info_type_in IN VARCHAR2,
comp_event_id_in IN qdb_comp_events.comp_event_id%TYPE,
user_id_in IN INTEGER)
RETURN BOOLEAN
IS
c_user_id CONSTANT INTEGER
:= NVL (user_id_in, qdb_user_mgr.guest_user_id) ;
c_could_have_played CONSTANT BOOLEAN
:= can_play (comp_event_id_in, c_user_id) ;
c_quiz_answered CONSTANT BOOLEAN
:= ex_u_qdb_compev_answers (comp_event_id_in, c_user_id) ;
c_quizzes_accepted BOOLEAN;
c_results_accepted BOOLEAN;
c_closed_or_ranked BOOLEAN;
c_ranked_or_voided BOOLEAN;
c_is_solve_problem BOOLEAN;
c_closed_for_player BOOLEAN;
CURSOR required_info_cur
IS
SELECT c.players_accept_quizzes,
c.players_accept_scores,
ce.comp_event_status,
ce.ignore_results,
ce.quizzes_accepted,
ce.scores_accepted,
ce.pl_see_quiz_after,
ce.pl_see_answer_after,
ce.pl_see_results_after,
ce.ev_see_quiz_after,
ce.ev_see_answer_after,
ce.ev_see_results_after,
ce.tm_member_results_preview,
ce.author_can_play,
ce.hide_quizzes,
ce.is_private,
ct.text comp_type,
ct.comp_type_id
FROM qdb_competitions c, qdb_comp_events ce, qdb_comp_types ct
WHERE c.competition_id = ce.competition_id
AND c.comp_type_id = ct.comp_type_id
AND ce.comp_event_id = comp_event_id_in;
l_required_info required_info_cur%ROWTYPE;
l_return BOOLEAN;
PROCEDURE get_required_info
IS
BEGIN
OPEN required_info_cur;
FETCH required_info_cur INTO l_required_info;
CLOSE required_info_cur;
c_quizzes_accepted :=
l_required_info.players_accept_quizzes = qdb_config.c_no
OR ( l_required_info.players_accept_quizzes = qdb_config.c_yes
AND l_required_info.quizzes_accepted = qdb_config.c_yes);
c_results_accepted :=
l_required_info.players_accept_scores = qdb_config.c_no
OR ( l_required_info.players_accept_scores = qdb_config.c_yes
AND l_required_info.scores_accepted = qdb_config.c_yes);
c_ranked_or_voided :=
l_required_info.comp_event_status =
qdb_competition_mgr.c_compev_ranked
OR ( l_required_info.ignore_results = qdb_config.c_yes
AND l_required_info.comp_event_status =
qdb_competition_mgr.c_compev_closed);
c_closed_or_ranked :=
/* Also returns TRUE if I took it. So just go with status.
comp_event_closed_for_user (comp_event_id_in, c_user_id)*/
l_required_info.comp_event_status IN (qdb_competition_mgr.c_compev_closed,
qdb_competition_mgr.c_compev_ranked);
c_closed_for_player :=
comp_event_closed_for_user (comp_event_id_in, c_user_id);
c_is_solve_problem :=
l_required_info.comp_type_id =
qdb_competition_mgr.c_solve_problem_ct_id;
END;
FUNCTION everyone_can (moment_in IN VARCHAR2)
RETURN BOOLEAN
IS
BEGIN
RETURN CASE moment_in
WHEN qdb_competition_mgr.c_resavail_never
THEN
FALSE
WHEN qdb_competition_mgr.c_quiz_accepted
THEN
c_quizzes_accepted
WHEN qdb_competition_mgr.c_result_accepted
THEN
c_results_accepted
WHEN qdb_competition_mgr.c_resavail_closed
THEN
c_closed_or_ranked
WHEN qdb_competition_mgr.c_resavail_ranked
THEN
c_ranked_or_voided
ELSE
FALSE
END;
IF qdb_utilities.trace_is_on
THEN
qdb_utilities.trace_activity (
'can_show_information for everyone moment ' || moment_in,
l_return);
END IF;
END;
FUNCTION player_can (moment_in IN VARCHAR2)
RETURN BOOLEAN
IS
l_return BOOLEAN;
BEGIN
l_return :=
CASE moment_in
WHEN qdb_competition_mgr.c_resavail_never
THEN
FALSE
WHEN qdb_competition_mgr.c_quiz_accepted
THEN
c_quizzes_accepted
WHEN qdb_competition_mgr.c_result_accepted
THEN
c_results_accepted
WHEN qdb_competition_mgr.c_resavail_answered
THEN
c_quiz_answered
WHEN qdb_competition_mgr.c_resavail_closed
THEN
c_closed_or_ranked
OR ( info_type_in = c_see_correctness
AND l_required_info.players_accept_quizzes =
qdb_config.c_yes)
WHEN qdb_competition_mgr.c_resavail_ranked
THEN
c_ranked_or_voided
ELSE
FALSE
END;
RETURN l_return;
END;
BEGIN
IF comp_event_id_in IS NULL
THEN
/* A reviewer may be reviewing an unscheduled quiz... */
l_return := info_type_in = c_see_answers;
ELSE
get_required_info;
/* Can always see stuff for a "solve problem" quiz. */
l_return := c_is_solve_problem;
IF NOT l_return
THEN
CASE info_type_in
WHEN c_see_my_choices
THEN
/* For this choice ONLY, the acceptance status of quizzes does not apply */
l_return :=
CASE
WHEN c_quiz_answered OR c_could_have_played
THEN
player_can (l_required_info.pl_see_quiz_after)
ELSE
everyone_can (l_required_info.ev_see_quiz_after)
END;
WHEN c_see_correctness
THEN
l_return :=
CASE
WHEN c_quiz_answered OR c_could_have_played
THEN
player_can (l_required_info.pl_see_answer_after)
ELSE
everyone_can (l_required_info.ev_see_answer_after)
END;
WHEN c_see_answers
THEN
/* Control display of overall answer, choice explanations, etc. */
l_return :=
CASE
WHEN NOT c_quizzes_accepted
THEN
FALSE
WHEN c_quiz_answered OR c_could_have_played
THEN
player_can (l_required_info.pl_see_answer_after)
ELSE
everyone_can (l_required_info.ev_see_answer_after)
END;
WHEN c_see_results
THEN
/* Display stats, rankings, % correct, etc. */
l_return :=
CASE
WHEN NOT c_results_accepted
THEN
FALSE
WHEN c_quiz_answered OR c_could_have_played
THEN
player_can (l_required_info.pl_see_results_after)
ELSE
everyone_can (
l_required_info.ev_see_results_after)
END;
END CASE;
END IF;
END IF;
RETURN l_return;
END;
/* And now specialized programs for different scenarios. */
FUNCTION can_see_my_choices (comp_event_id_in IN INTEGER,
user_id_in IN INTEGER)
RETURN BOOLEAN
IS
BEGIN
RETURN can_show_information (c_see_my_choices,
comp_event_id_in,
user_id_in);
END;
FUNCTION can_see_correctness (comp_event_id_in IN INTEGER,
user_id_in IN INTEGER)
RETURN BOOLEAN
IS
BEGIN
RETURN can_show_information (c_see_correctness,
comp_event_id_in,
user_id_in);
END;
FUNCTION can_see_answers (comp_event_id_in IN INTEGER,
user_id_in IN INTEGER)
RETURN BOOLEAN
IS
BEGIN
RETURN can_show_information (c_see_answers,
comp_event_id_in,
user_id_in);
END;
FUNCTION can_see_results (comp_event_id_in IN INTEGER,
user_id_in IN INTEGER)
RETURN BOOLEAN
IS
BEGIN
RETURN can_show_information (c_see_results,
comp_event_id_in,
user_id_in);
END;
FUNCTION results_available_for (comp_event_id_in IN INTEGER,
user_id_in IN INTEGER)
RETURN BOOLEAN
IS
BEGIN
RETURN can_see_results (comp_event_id_in, user_id_in);
END results_available_for;
16 February 2014
Results of First-ever SQL Championship for 2013
You will find below the rankings for the first ever 2013 SQL championship.
Congratulations first and foremost to our top-ranked players:
1st Place: Vincent Malgrat of French Republic
2nd Place: Christoph Hillinger of Austria
3rd Place: Tony Winn of Australia
Next, congratulations to everyone who played in the championship. I hope you found it entertaining, challenging and educational. And for those who were not able to participate in the championship, you can take the quizzes next week through the Practice feature. We will also make the championship as a whole available as a Test, so you can take it just like these 39 players did.
And special thanks must go out to Kim Berg Hansen for writing these challenging quizzes and to Vitaliy Lyanchevskiy (a.k.a., Elic) for his thorough reviews. No objections were reported on these quizzes, and that was due entirely to the deep technical skills and attention to detail of both Kim and Vitaliy.
Warm regards,
Steven Feuerstein
Congratulations first and foremost to our top-ranked players:
1st Place: Vincent Malgrat of French Republic
2nd Place: Christoph Hillinger of Austria
3rd Place: Tony Winn of Australia
Next, congratulations to everyone who played in the championship. I hope you found it entertaining, challenging and educational. And for those who were not able to participate in the championship, you can take the quizzes next week through the Practice feature. We will also make the championship as a whole available as a Test, so you can take it just like these 39 players did.
And special thanks must go out to Kim Berg Hansen for writing these challenging quizzes and to Vitaliy Lyanchevskiy (a.k.a., Elic) for his thorough reviews. No objections were reported on these quizzes, and that was due entirely to the deep technical skills and attention to detail of both Kim and Vitaliy.
Warm regards,
Steven Feuerstein
| Rank | Name | Country | Total Time | % Correct | Total Score |
|---|---|---|---|---|---|
| 1 | Vincent Malgrat | French Republic | 34 mins 51 secs | 86% | 2513 |
| 2 | Christoph Hillinger | Austria | 43 mins 01 secs | 86% | 2405 |
| 3 | Tony Winn | Australia | 35 mins 40 secs | 78% | 2332 |
| 4 | mentzel.iudith | Israel | 38 mins 59 secs | 84% | 2285 |
| 5 | james su | Canada | 37 mins 29 secs | 78% | 2240 |
| 6 | Chris Saxon | United Kingdom | 22 mins 52 secs | 71% | 2168 |
| 7 | Niels Hecker | Germany | 41 mins 41 secs | 80% | 2096 |
| 8 | Leszek Grudzień | Poland | 35 mins 09 secs | 71% | 1997 |
| 9 | Sachi | United States | 31 mins 29 secs | 71% | 1985 |
| 10 | koko | Ukraine | 40 mins 19 secs | 78% | 1974 |
| 11 | Chase Mei | Canada | 44 mins 11 secs | 76% | 1966 |
| 12 | Scott Wesley | Australia | 19 mins 45 secs | 63% | 1960 |
| 13 | Zoltan Fulop | Hungary | 35 mins 04 secs | 69% | 1959 |
| 14 | JohnR | United States | 40 mins 01 secs | 73% | 1935 |
| 15 | Ivan Blanarik | Slovakia | 36 mins 27 secs | 69% | 1856 |
| 16 | Rimantas Adomauskas | Lithuania | 42 mins 50 secs | 73% | 1843 |
| 17 | Justin Cave | United States | 43 mins 46 secs | 73% | 1810 |
| 18 | Michal Cvan | Slovakia | 39 mins 23 secs | 69% | 1797 |
| 19 | Eric Levin | United States | 41 mins 58 secs | 69% | 1786 |
| 20 | Andres | Estonia | 44 mins 51 secs | 73% | 1748 |
| 21 | Viacheslav Stepanov | Russia | 43 mins 12 secs | 71% | 1736 |
| 22 | Rytis Budreika | Lithuania | 24 mins 23 secs | 59% | 1722 |
| 23 | Telmoc | Portugal | 30 mins 18 secs | 59% | 1714 |
| 24 | Yuan Tschang | United States | 44 mins 34 secs | 71% | 1694 |
| 25 | Krzysztof Helbin | Poland | 34 mins 15 secs | 65% | 1690 |
| 26 | Jason H | United States | 38 mins 09 secs | 65% | 1677 |
| 27 | Stelios Vlasopoulos | Belgium | 29 mins 16 secs | 61% | 1665 |
| 28 | Anna Onishchuk | Ireland | 20 mins 37 secs | 55% | 1663 |
| 29 | Matthias Rogel | Germany | 31 mins 35 secs | 59% | 1653 |
| 30 | Sean Molloy | United States | 41 mins 57 secs | 67% | 1651 |
| 31 | Chad Lee | United States | 42 mins 36 secs | 67% | 1633 |
| 32 | Milibor Jovanovic | Serbia | 42 mins 26 secs | 65% | 1611 |
| 33 | Marsel Fattakhov | Russia | 27 mins 26 secs | 59% | 1571 |
| 34 | Randy Gettman | United States | 44 mins 50 secs | 65% | 1493 |
| 35 | Giedrius Deveikis | Lithuania | 44 mins 52 secs | 57% | 1418 |
| 36 | Hertha Rettinger | Germany | 30 mins 17 secs | 55% | 1414 |
| 37 | swart260 | Netherlands | 39 mins 38 secs | 55% | 1282 |
| 38 | Pavel Vorontsov | Russia | 13 mins 43 secs | 39% | 1181 |
| 39 | Tobias Stark | Germany | 44 mins 12 secs | 43% | 741 |
20 January 2014
Participants in the Q4 2013 PL/SQL Championship
The following players will be invited to participate in the Q4 2013 championship. The number in parentheses after their names are
the number of playoffs in which they have already participated.
Congratulations to all listed below on their accomplishment and best of luck in the upcoming competition!
We currently plan to hold the championship on 27 February (all at the same time world-wide), and are waiting for confirmation from players that this day will work.
Note: we accepted the top 50 ranked players into the SQL and Logic championships, but still only the top 25 players for PL/SQL. We are going to shift to the top 50 for all championships, starting this quarter, but did not feel it was appropriate to switch the rules for the PL/SQL championship after the fact.
See the FAQ for an explanation of the three ways a player can qualify for the playoff.
Congratulations to all listed below on their accomplishment and best of luck in the upcoming competition!
We currently plan to hold the championship on 27 February (all at the same time world-wide), and are waiting for confirmation from players that this day will work.
Note: we accepted the top 50 ranked players into the SQL and Logic championships, but still only the top 25 players for PL/SQL. We are going to shift to the top 50 for all championships, starting this quarter, but did not feel it was appropriate to switch the rules for the PL/SQL championship after the fact.
See the FAQ for an explanation of the three ways a player can qualify for the playoff.
| Name | Rank | Qualification | Country |
|---|---|---|---|
| Stelios Vlasopoulos (9) | 1 | Top 25 | Belgium |
| Rakesh Dadhich (4) | 2 | Top 25 | India |
| mentzel.iudith (12) | 3 | Top 25 | Israel |
| Siim Kask (12) | 4 | Top 25 | Estonia |
| Janis Baiza (8) | 5 | Top 25 | Latvia |
| Niels Hecker (13) | 6 | Top 25 | Germany |
| Viacheslav Stepanov (11) | 7 | Top 25 | Russia |
| Jerry Bull (10) | 8 | Top 25 | United States |
| Zoltan Fulop (6) | 9 | Top 25 | Hungary |
| swart260 (6) | 10 | Top 25 | Netherlands |
| Mike Pargeter (11) | 11 | Top 25 | United Kingdom |
| Vincent Malgrat (6) | 12 | Top 25 | French Republic |
| Milibor Jovanovic (4) | 13 | Top 25 | Serbia |
| Yuri Pedan (3) | 14 | Top 25 | Ukraine |
| Oleksiy Varchyn (1) | 15 | Top 25 | Norway |
| Ajaykumar Gupta (3) | 16 | Top 25 | Singapore |
| Andrey Zaytsev (1) | 17 | Top 25 | Russia |
| james su (7) | 18 | Top 25 | Canada |
| Chad Lee (9) | 19 | Top 25 | United States |
| Rytis Budreika (0) | 20 | Top 25 | Lithuania |
| Kevan Gelling (8) | 21 | Top 25 | Isle of Man |
| Joaquin Gonzalez (6) | 22 | Top 25 | Spain |
| Jeroen Rutte (6) | 23 | Top 25 | Netherlands |
| Manfred Kleander (0) | 24 | Top 25 | Austria |
| Anna Onishchuk (7) | 25 | Top 25 | Ireland |
| _tiki_4_ (5) | 26 | Wildcard | Germany |
| Frank Schmitt (7) | 27 | Wildcard | Germany |
| Krzysztof Helbin (2) | 28 | Wildcard | Poland |
| Leszek Grudzień (1) | 29 | Wildcard | Poland |
| João Barreto (3) | 30 | Wildcard | Portugal |
| Ravshan Abbasov (0) | 31 | Wildcard | Uzbekistan |
| Peter Auer (0) | 32 | Wildcard | Germany |
| dmitrysk (0) | 33 | Wildcard | Russia |
| Lukasz Kubicki (0) | 34 | Wildcard | Poland |
| Frank Puechl (3) | 35 | Wildcard | Germany |
| Karel Prech (2) | 40 | Correctness | Czech Republic |
| Thierry Poels (6) | 43 | Correctness | Belgium |
| Michal Cvan (10) | 45 | Correctness | Slovakia |
| Telmoc (1) | 46 | Correctness | Portugal |
| Yuan Tschang (7) | 84 | Correctness | United States |
| Randy Gettman (11) | 109 | Correctness | United States |
| ChallengeMe (0) | 176 | Correctness | United Kingdom |
| Anil Jha (2) | 182 | Correctness | United States |
| Goran Stefanović (4) | 197 | Correctness | Serbia |
| Dan Kiser (5) | 213 | Correctness | United States |
Subscribe to:
Posts (Atom)
