 However, at the beginning of this year, our 10.11 series went long-term support for five years of that and we're continuing the same pattern. Colin mentioned the early, the version numbering sort of jump. What we've decided as our process now is that, you know, after we release a long-term support release, we'll bump the major version. So the long-term support release is always going to be the major minor version below the big numbers on that. I probably don't even have to try this again. Tony.cc MariaDBSafosAce. Oops, I almost did it, almost did it. Don't stuff it up, don't stuff it up. So to be a bit different from usual, I'm actually doing this presentation at Juniper Notebook, which was one of our developed features from one of our former staff members. If you want to follow on this Tony.cc MariaDBSafosAce, we'll bring you up an instance where you can play with the running server. As before I said, you know, I started in 2011. So if we run that and this is what I'm running in this test on this little cloud service. So new features, I'll run into them a little bit quickly. UUID is now a data type. This is added in 10.7. Strangely enough, it looks like a UUID. You can refer to this just as a text name there. You can insert things into it and they come back as the text of a UUID. You can convert binary strings into a UUID and you expect that if you've got something invalid, you can expect it to fail and give a warning. Strangely enough, just what a normal data type is meant to do. So 10.7 is when we added that UUID data type. The other data type that was added is INED version 4. You may ask what happened to IFA in version 6. Well, actually INED version 6 was added all the way back in 10.5. So a quick recap. There is an INED version 5. INED version 6 here. It can take IP version 4 mapped addresses and also IP version 6 addresses as you'd expect. So what we added was INED version 4. As a data type, it's just enough stores them and treats them exactly like a data type there with validations as you'd expect. In MurrayDB 10.10, I think we added this UCA collation. So historically MurrayDB has been on the collation standard of the UCA of 5.2.0. We've finally updated to the latest collation steps of 14.0.0. Being a standards body, they seem to move quickly. It's now after 15. Sorry, we can't quite move that quickly. But it was a major effort to get this collation work in. So what this means is these are all the new collations that are available. For those that dealt with MySQL collations before, there's a case insensitive and a case sensitive version of these. And what is new is the AI and the AS. And that's the accent sensitive and accent insensitive versions of them. We'll see like previous ones, there's a no pad and a pad collation depending on how you want to actually treat white space in your collations. So this is there for all the languages of the standard going through. Yes, there's a lot of them on that. And what you do is you just attach this to a UTF-A type and you've got your own collation there. Since 10.7, we've obviously been catching up with the world on using a lot of JSON functions. So there's this JSON equals. Two JSON objects are equal if they're the same. If they're not the same, it returns false, which is kind of what you expect. But to make things a little bit easier, we've actually made a JSON normalised function to bring the text of a JSON object down to a normalised form. And the useful for this is actually if you want to actually have a unique JSON object in your tables, you just create a generate column as jnorm here and that's the normalised value of it. We have a unique key on it. And what that means is that if we insert Alice with blue that way and try to rearrange it and do it and insert again, we've got a duplicate key error. So it's for me to normalise it down. JSON Pretty is pretty much the same as JSON Detail in MySQL. Just creates a pretty version of it. And this was a quick community contribution that we received. Probably should list them a little bit more. Got a CRC function. Was mainly added for a test case, but it's there for everyone else. Render mites was also a user contribution from our community that wanted the same as the MySQL function. So that one's there now. JSON Histograms. For those that remember back to the Marine Bee 10.1 days, there was a move to have histograms there that represents the distribution of the data over a table. So what JSON Histograms does is extends this syntax in the way that it's stored in the table to give better selectability, particularly around those edge cases as data changes from one string to another gives a better granularity that way and so you'll get kind of better queries. So here we create a table. We push a bunch of values into it. We run an analysed table with histograms with the JSON-HB histogram type. And what we see in the column stats at the end, all the way at the end as this case may be, is just a histogram in a JSON format that describes the layer of the table, where things start and where things end. And obviously it should move towards a bigger data set that becomes a lot more significant on that. Another function, JSON Sort Key. Too busy on the JSON mindset. So Natural Sort is, I guess when you've got numbers and letters all in the same thing, you want the numbers to be sorted in a numerical order and the alpha numerics in an alpha numeric order. So we create a table, sort of bunch of things. If we didn't have a Natural Sort Key, what we'd see here is that A2 came after A11, which doesn't actually mean not the Natural Sort of Order that people may see things in. But if we do a Natural Sort Key as the order by, obviously not the most efficient way to do it, what we see is the A1, A2, A11 coming up in that order. Some applications of this you may not immediately think of. If you want, say, IP addresses sorted or anything with actually a bunch of numbers separated, you can make this to make sure the IP addresses come out in order. Another useful application for this is if you've got version numbers in a table and you want them to come out in order, just do a Natural Sort Key on that and they'll come out in order. Not sure if I did it twice. Why is this never the go? For those who have played with large amounts of concatenation, string less, string right, and alignment and trying to do arguably silly things like formatting in databases, we've made the S-format function there to make things a little bit easier. So this introduces a pretty much adjacent kind of formatting function into the database so you can format it there. This is based on the lib-format library which is going to be introduced into the C20 standard but for the most part now it's an external library and this will allow you to do things like use two values here and just pass arguments at the end. If you were to do that in previously, you'd end up with a bunch of string concat functions, possibly a bunch of cast functions, so now you just get it all pretty much easily there. And there's a whole bunch more features in the format like left alignment, the things you normally see in printf anyway. Descending indexes, something that MySQL had for a while but we finally got them, was if you're doing a sort where one index is in one direction and you're doing an order by that field and an order by the other field in the other direction, now you can declare the index that maps to that correctly so you can use the entire index for the sorting rather than just part of it and relying on it to sort afterwards. And a couple of query plans will get through that fine. Convert petitions, for those who have worked with petitions and trying to get a petition out into a table or a table into a petition, you may have seen these steps before, from a table you do an altar, we create a new petition, we remove a petition, we exchange it and drop the other one. Or if you're doing the other way, moving a normal table into a petition, you get the values and then you try to swap and exchange things before. What we've done now is we've created a simplified syntax where you've got one altar's table variant to move a petition into a normal table and another altar table variant to convert a normal table straight into a petition with the constraint around the values in that petition. So that's I guess one simple application. System version tables, they were there since 10.5 if I remember, so it's a rather old feature. So what's the new aspect here is we've gained the ability with enabled system variable that you can actually insert into a table. So you're actually able to migrate data that might be in ordinary tables into system tables. So a quick recap on what system versioning is. If we've got a table, we see it's only got one column. It's got system versioning enabled. When we insert it into it, we've got these two magic columns, row start and row end, and they represent time stamps of when was that single value valid in that table. So here it was developed from the beginning of 1980 to 20 hours and one second later in 1980, it doesn't exist. So what you can do is you can query it as of, you know, one second into the interval if the value is there. Anytime before it, it didn't exist. And so that's the system version table. You've got a concept that there's a current table and there's what was in the past and you've got this extended as of syntax to query what was in the past. Query password reset, reuse plug-in. Very simple plug-in, means you just can't set the same password twice and it regains a history on that first that made that sort of compliance. Just keep in mind that while we add these things like plugins of password reuse, there's actually a plug-in API for that. So you can actually develop your own plugins for password reuse and all the way back to even data types. The data types is actually a plug-in in MariaDB. So you can actually write your own data types if you're so inclined. There's a working community that's going on to make some of these plugins a lot more available by making wrappers in Rust so you can write your own wrappers in plugins in Rust and get those into the server. There's a HeshCorp key management plug-in just like Pacona has to integrate with the key managers. This integrates with our freely available transparent data encryption that's been there since 10.0, 10.1, long time. And if it was installed in this machine, it would show up. GetDiagnostics is a mechanism that's sort of not commonly seen. If you've got a value and sort of got like one value in and you insert a value, you get a duplicate entry for the primary key. For this one, it's fairly obvious that it's the second one because that's the only value. If you had more complex unique key constraints or otherwise that it's not really obvious which one was have. So if you want to do some error handling, you can say GetDiagnostics and it was the second row number two that was the error handling. Function attributes in and out are now a function attribute so you can make sure you're using your functions the right way. In most cases, there's a constraint about it being in a select that's not valid. Alter. Yep, Parandies are going to do a talk later so I'm not actually going to cover this. He'll cover that a lot more better but in the replication that Alter tables are pushed through a lot quicker. BINLOG, I think there's a community contribution as well. Finally, got all the arguments just for GTID data types that was added in 10.10 so you can do a start position, a stop position and use GTIDs in the form later way that you would have used BINLOG positions before. On scenarios, I guess you're sometimes frequently transferring a master to a replica or a slave and back with the GTIDs. If you didn't know them really, really well, it was easy to get them mixed up so what we've added is just a change master to make to slave, single instruction, hard to get it wrong and just swap the positions around on it and enable it to become a replica. Granted public, it's not the same as non-ish user. It means that every SQL user has access to the test in this table, which is fine. Read-only, we've split out the read-only from the super user so it's a separate grant and there's reasons you may want to do that around orchestration and management. For NDB and the underlines, we've got a fast insertion. We've got the resize of... so the table spaces can do a number of them on a restart and that's about all I've got time for. Yeah, there's a few things there. A few tech searches, a bit better memory management and a bit of auto versioning. Apologies for running late and there's also some other UI improvements. Any questions or future requests? Sure. You mentioned UUID types. Yeah. Are all UUID types supported or is there a generator for them? If you use them as in place of an auto increment.