There have been multiple accounts created with the sole purpose of posting advertisement posts or replies containing unsolicited advertising.

Accounts which solely post advertisements, or persistently post them may be terminated.

programmer_humor

This magazine is from a federated server and may be incomplete. Browse more on the original instance.

akash_rawal , in no.. just no

I actually like this. This would allow reuse of all the infrastructure we have around XML. No more SQL injection and dealing with query parameters? Sign me up!

CanadaPlus ,

Assuming it’s built well. As someone else pointed out, it doesn’t look quite right here.

utopianfiat ,

So you mean like parameterized queries, which exist?

akash_rawal ,

Better than parameterized queries. Yes, we have stuff like query(“INSERT INTO table(status, name) VALUES ($1, $2);”).bind(ent.status).bind(ent.name).execute…, but that’s kind of awful isn’t it? With XML queries, we could use any of the XML libraries we have to create and manipulate XML queries without risking ‘XML injection’. e.g we could convert ordinary structs/classes into column values automatically without having to use any ORM.

docAvid ,

I mean, that’s just a bad library interface. With a halfway decent interface, you can do something like


<span style="color:#323232;">query('insert into foo (status, name) values (: status, : name)', ent)
</span>

No orm required. With tagged templates in JS, you can do


<span style="color:#323232;">q`insert into foo (status, name) values (${ent.status}, ${ent.name})`
</span>

Even wrap it in a function with destructuring to get rid of ent:


<span style="color:#323232;">const addFoo = (q, {status, name}) =>
</span><span style="color:#323232;">    q`insert into foo (status, name) values (${status}, ${name})`
</span>

Typescript can add type safety on top of that, of course. And there’s the option to prepare a query once and execute it multiple times.

Honestly, the idea of manipulating XML queries, if you mean anything more fancy than the equivalent of parameter injection, sounds over-complicated, but I’d love to see a more concrete example of what you mean by that.

akash_rawal ,

I was thinking along the lines of


<span style="color:#323232;">
</span><span style="color:#323232;">  foo<</span><span style="color:#63a35c;">table</span><span style="color:#323232;">></</span><span style="color:#63a35c;">table</span><span style="color:#323232;">>
</span><span style="color:#323232;">  
</span><span style="color:#323232;">    paid
</span><span style="color:#323232;">    bob
</span><span style="color:#323232;">  
</span><span style="color:#323232;">
</span>

Plenty of libraries can build the XML using structs/classes. e.g. with serde:


<span style="font-style:italic;color:#969896;">//Data type for row
</span><span style="color:#323232;">#[derive(serde::Serialize)]
</span><span style="font-weight:bold;color:#a71d5d;">pub struct </span><span style="color:#323232;">Foo {
</span><span style="color:#323232;">	</span><span style="font-weight:bold;color:#a71d5d;">pub </span><span style="color:#323232;">status: String,
</span><span style="color:#323232;">	</span><span style="font-weight:bold;color:#a71d5d;">pub </span><span style="color:#323232;">name: String,
</span><span style="color:#323232;">}
</span><span style="color:#323232;">
</span><span style="font-style:italic;color:#969896;">//Example row
</span><span style="font-weight:bold;color:#a71d5d;">let</span><span style="color:#323232;"> ent </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> Foo {
</span><span style="color:#323232;">    status: </span><span style="color:#183691;">"paid"</span><span style="color:#323232;">.</span><span style="color:#62a35c;">into</span><span style="color:#323232;">(),
</span><span style="color:#323232;">    name: </span><span style="color:#183691;">"bob"</span><span style="color:#323232;">.</span><span style="color:#62a35c;">into</span><span style="color:#323232;">(),
</span><span style="color:#323232;">}
</span><span style="color:#323232;">
</span><span style="font-style:italic;color:#969896;">//Example execution
</span><span style="color:#323232;">sqlx::query(</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp;serde_xml_rs::to_string(</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp;InsertStmt{
</span><span style="color:#323232;">	table: </span><span style="color:#183691;">"foo"</span><span style="color:#323232;">.</span><span style="color:#62a35c;">into</span><span style="color:#323232;">(),
</span><span style="color:#323232;">	value: </span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp;ent,
</span><span style="color:#323232;">})</span><span style="font-weight:bold;color:#a71d5d;">?</span><span style="color:#323232;">).</span><span style="color:#62a35c;">execute</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">&</span><span style="color:#323232;">amp;conn)</span><span style="font-weight:bold;color:#a71d5d;">?</span><span style="color:#323232;">;
</span>

Or with jackson-dataformat-xml:


<span style="font-style:italic;color:#969896;">//Data type for row
</span><span style="font-weight:bold;color:#a71d5d;">public class </span><span style="color:#0086b3;">Foo </span><span style="color:#323232;">{
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">public</span><span style="color:#323232;"> string status;
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">public</span><span style="color:#323232;"> string name;
</span><span style="color:#323232;">}
</span><span style="color:#323232;">
</span><span style="font-style:italic;color:#969896;">//Example row
</span><span style="color:#0086b3;">Foo</span><span style="color:#323232;"> ent </span><span style="font-weight:bold;color:#a71d5d;">= new </span><span style="color:#0086b3;">Foo</span><span style="color:#323232;">();
</span><span style="color:#323232;">foo.status </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">"paid"</span><span style="color:#323232;">;
</span><span style="color:#323232;">foo.value </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">"bob"</span><span style="color:#323232;">;
</span><span style="color:#323232;">
</span><span style="font-style:italic;color:#969896;">//Example execution
</span><span style="color:#0086b3;">XmlMapper</span><span style="color:#323232;"> xmlMapper </span><span style="font-weight:bold;color:#a71d5d;">= new </span><span style="color:#0086b3;">XmlMapper</span><span style="color:#323232;">();
</span><span style="color:#0086b3;">String</span><span style="color:#323232;"> xml </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> xmlMapper.writeValueAsString(</span><span style="font-weight:bold;color:#a71d5d;">new </span><span style="color:#0086b3;">InsertStmt</span><span style="color:#323232;">(</span><span style="color:#183691;">"foo"</span><span style="color:#323232;">, ent));
</span><span style="font-weight:bold;color:#a71d5d;">try </span><span style="color:#323232;">(</span><span style="color:#0086b3;">Statement</span><span style="color:#323232;"> stmt </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> conn.createStatement()) {
</span><span style="color:#323232;">    stmt.executeUpdate(xml)
</span><span style="color:#323232;">}
</span>

I don’t do JS (yet) but maybe JSX could also do similar things with XML queries.

No more matching $1, $2, … (or ? for mysql) with individual columns, I could dump entire structs/objects into a query and it would work.

themusicman , in 4 billion if statements

It’s not a trade off between dev time, execution time and memory as the author claims. It’s materially worse for all 3

rainerloeten ,
@rainerloeten@lemmy.world avatar

I think he was being sarcastic, playing with words. Meaning youbtrade in time, runtime and memory and get nothing in return.

Of course it’s worse, I mean, that was the point of this blogpost, wasn’t it? :p It’s just a (long) joke.

themusicman ,

On reread, you’re totally right. Went right over my head

Kolanaki , in Good luck web devs
@Kolanaki@yiffit.net avatar

How many minor operating systems support it? 🤔

backhdlp ,
@backhdlp@lemmy.blahaj.zone avatar

I’m assuming most that can run Xorg.

jdaxe ,

Correct

atocci ,

I think ToaruOS does? I remember reading something about it but haven’t managed to install it yet to verify.

jol ,

There’s ReactOS and BSD off the top of my head.

Voyajer ,
@Voyajer@lemmy.world avatar

Haiku counts

gravitas_deficiency , in no.. just no

I want to hate this. I really do. But the problem is… I think I like it.

naonintendois ,

But how do I know if the WHERE clause is AND or OR?

gravitas_deficiency ,

Fair. The constraint nodes should probably exist under an And node.

akash_rawal ,

We can say default is and and add an Or node for or. Similar to SoP notation, you only write +.

victorz ,

How about an or boolean attribute.

lorty ,
@lorty@lemmygrad.ml avatar

This needs a bit of work but it could be interesting

xX_fnord_Xx , in Good luck web devs

Finally, Peewees Playhouse has found open source representation.

catbaba ,

Jambi is GNU

Primarily0617 , in no.. just no

if you don't believe that adding more structure to the absolute maniacal catastrophe that is sql is a good thing then i'm going to start to have doubts about your authenticity as a human being

GBU_28 ,

Huh? Sql is one of the most powerful, action packed (as in you can move lots of shit with few commands) languages out there.

It’s transferable and ubiquitous.

Primarily0617 ,

powerful isn't the same as well-structured

it was written to be a language that anybody could read or write as well as english, which just like every other time that's been tried, results in a language that's exactly as anal about grammar as C or Python except now it's impossible to remember what that structure is because adding anything to the language to make that easier is forbidden

when you write a language where its designers were so keen for it to remain human readable that they made deleting all rows in a table the default action, i don't think "well structured" can be used to describe it

GBU_28 ,

Disagree, the difference between “week structured” and needing to know the rules of the verbs is pretty big, to me.

Solemarc ,

If you think this is more structured than traditional SQL, I really disagree. Is this a select * query, it’s ambiguous. Also what table is being queried here there’s no from or other table identifier.

QuazarOmega , (edited )

Me trying to remember on whose output data having, count, sum, etc. work

Once you know functions you would have no reason to go back.
I propose we make SQL into this:


<span style="color:#323232;">const MAX_AMOUNT = 42, MIN_BATCHES = 2
</span><span style="color:#323232;">
</span><span style="color:#323232;">database
</span><span style="color:#323232;">    .from(table)
</span><span style="color:#323232;">    .where(
</span><span style="color:#323232;">        (amount) => amount < MAX_AMOUNT,
</span><span style="color:#323232;">        table.field3
</span><span style="color:#323232;">    )
</span><span style="color:#323232;">    .select(table.field1, table.field3)
</span><span style="color:#323232;">    .group_by(table.field1)
</span><span style="color:#323232;">    .having(
</span><span style="color:#323232;">        (id) => count(id) >MIN_BATCHES
</span><span style="color:#323232;">        table.field0
</span><span style="color:#323232;">    )
</span>

(Sorry for any glaring mistakes, I’m too lazy right now to know what I’m doing)

…and I bet I just reinvented the wheel, maybe some JavaScript ORM?

xep ,
QuazarOmega , (edited )

Thanks for the suggestion! It looks interesting, not quite what I expected looking at that file*, but that may very well be better

Edit: other examples seem a bit more similar to mine, cool!

marcos ,

Well, if you lose the OOPism of those dots, we can talk.

Anyway, I’m really against the “having” tag. You need another keyword so that you can apply your filter after the group by?

physicswizard ,

Boy then are you going to hate QUALIFY

marcos ,

Yes, I do. It’s a lot of effort and hidden functionality to try to paper over the fact that the statements do not compose.

QuazarOmega ,

Well, if you lose the OOPism of those dots, we can talk.

That’s a good point, I didn’t even think about it, maybe a more functional style would make more sense?

rubythulhu ,

having is less annoying way of not doing needless/bug-prone repetition. if you select someCalculatedValue(someInput) as lol you can add having lol > 42 in mysql, whereas without (ie in pgsql) you’d need to do where someCalculatedValue(someInput) > 42, and make sure changes to that call stay in sync despite how far apart they are in a complex sql statement.

docAvid ,

Postgres has the having clause. If it didn’t, that wouldn’t work, as you can’t use aggregates in a where. If you have to make do without having, for some reason, you can use a subquery, something like select * from (select someCalculatedValue(someInput) as lol) as stuff where lol > 42, which is very verbose, but doesn’t cause the sync problem.

Also, I don’t think they were saying the capability having gives is bad, but that a new query language should be designed such that you get that capability without it.

rubythulhu ,

most languages have some first or third party lib that implements a query builder

expr , (edited )

Because you never learned SQL properly, from the sound of it.

Also, ORMs produce trash queries and are never expressive enough.

QuazarOmega ,

Because you never learned SQL properly, from the sound of it.

You might be right, though, to be fair, I also keep forgetting syntax of stuff when I don’t use it very often (read SQL (._.`))

Also, ORMa produce trash queries and are never expressive enough.

I meant to say that I would like the raw SQL syntax to be more similar to other programming languages to avoid needing to switch between thinking about different flows of logic

emptyother ,
@emptyother@programming.dev avatar

ORMs produce good queries if you know what you do. Which requires proper knowledge of SQL, unfortunately.

drathvedro ,

No. The arrow function in where eliminates any possibility of using indexes. And how do you propose to deal with logical expressions without resorting to shit like .orWhereNot() and callback hell? And, most importantly, what about joins?

cupcakezealot ,
@cupcakezealot@lemmy.blahaj.zone avatar

but sql doesn’t need to be structured that’s what abstraction layers and models are for

Lem453 ,

SQL is literally structured query language

expr ,

SQL is incredibly structured. It’s also a very good language, and developers need to stop piling on junk on top of it and producing terrible queries. Learn the damn language. It’s not that hard

Illecors , in Good luck web devs

I remember seeing the video of this. The guy was doing it for shits and giggles, but it ended up looking great!

mexicancartel ,

Can you link it?

Illecors ,

No idea what it was, sorry. One of the youtube recommendations at the time.

Stunning , in Good luck web devs

Dunder Mifflin did it first. The Pyramid.

swab148 ,
@swab148@startrek.website avatar

Sabre, you mean.

RagingRobot , in no.. just no

It’s kind of like graphQl you could make a compiler that would work with this.

utopianfiat ,

but why

SaltyIceteaMaker , in no.. just no
@SaltyIceteaMaker@iusearchlinux.fyi avatar

got no clue abot sql. what is wrong and how is it supposed to look like?

Daxtron2 ,

this basically xml being made to look like SQL. It’s gross and that’s why it’s funny

ILikeBoobies ,

Different language

traches ,

SQL is run on the server to communicate with a database. The screenshot is jsx, which is a front-end, UI templating language. Writing SQL this way is cursed

SirQuackTheDuck ,

It could be querying the in-browser database (that’s commonly used, such as with WhatsApp web), which would be seeded by a different part of the application

utopianfiat ,

Except that’s still a SQL dialect, not JSX. There’s no need to make this JSX.

schnurrito ,

SQL is supposed to look like this: SELECT status, name FROM some_table LIMIT 5

ThrowawayPermanente , in 4 billion if statements

Let’s be real though, everything is IF statements all the way down

Th4tGuyII ,
@Th4tGuyII@kbin.social avatar

There's not a single thing in this universe that cannot be accomplished with enough IF statements... as long as you've got infinite time to wait

firecat ,

The problem with if is the answer comes from user. There’s no mathematical reason or scientific explanation, only programmer who thinks the answer should include the subject.

Th4tGuyII ,
@Th4tGuyII@kbin.social avatar

True...

But even on a more metaphorical level, every single thing that has or will happen in this universe, down to even the smallest quantum fluctuations could be encapsulated into IF statements as long as you had enough of them.

waz ,

…you mean IF you’ve got an infinite time to wait?

Klear ,

…you mean if you’ve got IFinite time to wait?

idunnololz ,
@idunnololz@lemmy.world avatar

What if there was an unintentional infinite loop in your code. You could be waiting for infinite time only to learn the code had a bug. D:

expr , in no.. just no

Not only is this really gross, it’s also straight up wrong. It’s missing a from clause, and it makes no sense for a where clause to be nested under the select. The select list selects columns from rows that have already been filtered by the where clause. Same for the limit.

Also just gonna go ahead and assume the JSX parser will happily allow SQL injection attacks…

nephs ,

Booooo

CanadaPlus ,

I like the format, though.

ReluctantMuskrat ,

Clearly you’ve not had to write and maintain much XML.

CanadaPlus ,

I have not. I just thought it looks less goofy than a nested SQL statement split over multiple lines.

What are the issues with XML?

TootSweet , in Good luck web devs

What has science done?

MystikIncarnate ,

There’s no science here.

sbv , in The Holy Trinity of JavaScript

Sorry, 0 == ‘t’? What?

Limitless_screaming , (edited )
@Limitless_screaming@kbin.social avatar

that's not "t", it's "\t" which is just a tab. There's also "\n" for newline.

MinekPo1 ,
@MinekPo1@lemmygrad.ml avatar

yeah but why is a single character string containing a tab equal to zero ???

Limitless_screaming , (edited )
@Limitless_screaming@kbin.social avatar

That would be weird if a string containing a space wasn't equal to 0 " " == 0, but that's not the case in JS. If you think that "" and " " being equal to 0 is weird then I agree, but since they are, you should expect "t" and "n" to equal 0 too.

Ephera ,

The == operator in JS will try to cast the things being compared and do all kinds of ‘smart’ assumptions about what equality means. This is why everyone uses === instead…

8bitguy ,

Unless you enjoy inviting the chaos.

Sonotsugipaa ,
@Sonotsugipaa@lemmy.dbzer0.com avatar

It still makes no sense though

Limitless_screaming ,
@Limitless_screaming@kbin.social avatar

If " " wasn't equal to 0, it wouldn't make sense, but since a string containing a space equals 0, you'd expect the same to apply to a string containing a tab or a newline. (or at least I'd expect that)

FaceDeer ,
@FaceDeer@kbin.social avatar

I admit I have never dabbled in javascript, despite being a proficient programmer. I now dread to ask... would any string that contains only whitespace == 0? " \t\n \t " for example?

Limitless_screaming ,
@Limitless_screaming@kbin.social avatar

Yes, it would. Just like a string of spaces " " == 0, but it isn't that bad; === is Javascript's version of == in other languages, and, thus, you should be using it if you don't want that wonkiness.

== is just for convenience, like when you want to make sure that the user didn't leave the form empty and the button shouldn't be greyed out, and other UI stuff. Without these kinds of features JS wouldn't be used in so many toolkits.

atx_aquarian ,
@atx_aquarian@lemmy.world avatar

Ok, I always mistakenly assumed === was the identity operator in JS, too. TIL, thanks! As much as we like to poke fun at JS, every time I’m taught the rationale behind some aspect of it, I find it redeeming and even a little endearing.

atx_aquarian ,
@atx_aquarian@lemmy.world avatar

Ok, I always mistakenly assumed === was the identity operator in JS, too. TIL, thanks! As much as we like to poke fun at JS, every time I’m taught the rationale behind some aspect of it, I find it redeeming and even a little endearing.

bitcrafter ,

The explanation given to you makes it sound like == was deliberately designed to be a more convenient version of ===, but what actually happened was that == used to be the only equality operator in JavaScript, which meant that if you didn’t want it’s auto-coercing behavior then you needed to go out of your way to add additional type checks yourself. Because this was obviously a tremendously inconvenient state of affairs, the === operator was introduced later so that you could test for equality without having to worry about JavaScript doing something clever underneath the hood that you weren’t expecting.

masterspace ,

The explanation given to you makes it sound like == was deliberately designed to be a more convenient version of ===

I mean technically == was deliberately designed to be a more convenient version of other languages’ == operator… Just specifically more convenient for light UI stuff since that was all JavaScript was supposed to be used for at the time (or all they thought it would be used for).

But give programmers a way to write and execute a small script and someone will eventually use that to try and write an emulator that emulates the computer it’s running on, so the web evolved into more complicated applications, and then that convenience turned out to be wildly inconvenient, not to mention horribly unexpected for programmers coming from other languages, so then they added the triple equality to match other languages.

sbv ,

It’s a slash-t in the comment. Maybe kbin has different rendering rules for comments?

https://sh.itjust.works/pictrs/image/7026f17a-f237-49d3-8d80-28632876acdb.png

Limitless_screaming , (edited )
@Limitless_screaming@kbin.social avatar

Oh, in that case I replied to @MinekPo1 with my answer to that. BTW can you see the slash in: t and "t".

sbv ,
Limitless_screaming , (edited )
@Limitless_screaming@kbin.social avatar

My bad. I just edited it. "t" t It's displaying correctly on Lemmy.world. So it seems like another Kbin only issue.

jtk ,
@jtk@lemmy.sdf.org avatar

Yeah, it’s true. I knew all the other ones, had to put that one in the dev tools console to believe it. I was just happy to know === continues to be sane in that comparison.

Blackmist ,

You have to remember that the underlying principle of JavaScript seemed to be “never throw an error”, even if what it’s being told to do is weapons grade bollocks.

cupcakezealot , in no.. just no
@cupcakezealot@lemmy.blahaj.zone avatar

please kindly send all javascript into the sun and explode it

db2 ,

That’s XML though… not that I’m disagreeing.

huginn ,

Not XML. JSX. It’s javascript’s answer to markup.

db2 ,

Gross.

dukk ,

The worst of both worlds…

karmiclychee ,

It’s like a weaponized grade of whatever they made CSS in JS out of

dan ,
@dan@upvote.au avatar

JSX is (mostly) XML though. It’s based on a combination of an older technology called E4X plus Facebook’s older BoltJS and XHP syntaxes. The original JSX parser was based on existing E4X grammar.

huginn ,

If you put it into an XML parser it will throw an error, so it’s no longer XML.

Sure it was based on it, but it’s not xml.

  • All
  • Subscribed
  • Moderated
  • Favorites
  • [email protected]
  • random
  • lifeLocal
  • goranko
  • All magazines