BitOneZero, 9 months ago Just because it’s written in Rust doesn’t make your app safe, or performant. Lemmy 0.18.4 listing posts, frequently via ORM Diesel: <span style="color:#323232;"> SELECT "post"."id", "post"."name", "post"."url", "post"."body", "post"."creator_id", "post"."community_id", "post"."removed", </span><span style="color:#323232;"> "post"."locked", "post"."published", "post"."updated", "post"."deleted", "post"."nsfw", "post"."embed_title", "post"."embed_description", </span><span style="color:#323232;"> "post"."thumbnail_url", "post"."ap_id", "post"."local", "post"."embed_video_url", "post"."language_id", "post"."featured_community", </span><span style="color:#323232;"> "post"."featured_local", </span><span style="color:#323232;"> "person"."id", "person"."name", "person"."display_name", "person"."avatar", "person"."banned", "person"."published", "person"."updated", </span><span style="color:#323232;"> "person"."actor_id", "person"."bio", "person"."local", "person"."private_key", "person"."public_key", "person"."last_refreshed_at", </span><span style="color:#323232;"> "person"."banner", "person"."deleted", "person"."inbox_url", "person"."shared_inbox_url", "person"."matrix_user_id", </span><span style="color:#323232;"> "person"."admin", </span><span style="color:#323232;"> "person"."bot_account", "person"."ban_expires", "person"."instance_id", </span><span style="color:#323232;"> "community"."id", "community"."name", "community"."title", "community"."description", "community"."removed", "community"."published", </span><span style="color:#323232;"> "community"."updated", "community"."deleted", "community"."nsfw", "community"."actor_id", "community"."local", "community"."private_key", </span><span style="color:#323232;"> "community"."public_key", "community"."last_refreshed_at", "community"."icon", "community"."banner", "community"."followers_url", </span><span style="color:#323232;"> "community"."inbox_url", "community"."shared_inbox_url", "community"."hidden", "community"."posting_restricted_to_mods", </span><span style="color:#323232;"> "community"."instance_id", "community"."moderators_url", "community"."featured_url", </span><span style="color:#323232;"> ("community_person_ban"."id" IS NOT NULL), </span><span style="color:#323232;"> "post_aggregates"."id", "post_aggregates"."post_id", "post_aggregates"."comments", "post_aggregates"."score", "post_aggregates"."upvotes", </span><span style="color:#323232;"> "post_aggregates"."downvotes", "post_aggregates"."published", "post_aggregates"."newest_comment_time_necro", </span><span style="color:#323232;"> "post_aggregates"."newest_comment_time", "post_aggregates"."featured_community", "post_aggregates"."featured_local", </span><span style="color:#323232;"> "post_aggregates"."hot_rank", "post_aggregates"."hot_rank_active", "post_aggregates"."community_id", "post_aggregates"."creator_id", </span><span style="color:#323232;"> "post_aggregates"."controversy_rank", "community_follower"."pending", </span><span style="color:#323232;"> ("post_saved"."id" IS NOT NULL), </span><span style="color:#323232;"> ("post_read"."id" IS NOT NULL), </span><span style="color:#323232;"> ("person_block"."id" IS NOT NULL), </span><span style="color:#323232;"> "post_like"."score", </span><span style="color:#323232;"> coalesce(("post_aggregates"."comments" - "person_post_aggregates"."read_comments"), </span><span style="color:#323232;"> "post_aggregates"."comments") </span><span style="color:#323232;"> </span><span style="color:#323232;"> FROM (((((((((((( </span><span style="color:#323232;"> ("post_aggregates" </span><span style="color:#323232;"> INNER JOIN "person" ON ("post_aggregates"."creator_id" = "person"."id")) </span><span style="color:#323232;"> INNER JOIN "community" ON ("post_aggregates"."community_id" = "community"."id")) </span><span style="color:#323232;"> LEFT OUTER JOIN "community_person_ban" ON (("post_aggregates"."community_id" = "community_person_ban"."community_id") AND ("community_person_ban"."person_id" = "post_aggregates"."creator_id")) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> INNER JOIN "post" ON ("post_aggregates"."post_id" = "post"."id") </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "community_follower" ON (("post_aggregates"."community_id" = "community_follower"."community_id") AND ("community_follower"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "community_moderator" ON (("post"."community_id" = "community_moderator"."community_id") AND ("community_moderator"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "post_saved" ON (("post_aggregates"."post_id" = "post_saved"."post_id") AND ("post_saved"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "post_read" ON (("post_aggregates"."post_id" = "post_read"."post_id") AND ("post_read"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "person_block" ON (("post_aggregates"."creator_id" = "person_block"."target_id") AND ("person_block"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "post_like" ON (("post_aggregates"."post_id" = "post_like"."post_id") AND ("post_like"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "person_post_aggregates" ON (("post_aggregates"."post_id" = "person_post_aggregates"."post_id") AND ("person_post_aggregates"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "community_block" ON (("post_aggregates"."community_id" = "community_block"."community_id") AND ("community_block"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "local_user_language" ON (("post"."language_id" = "local_user_language"."language_id") AND ("local_user_language"."local_user_id" = $2)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> </span><span style="color:#323232;"> WHERE </span><span style="color:#323232;"> ((( </span><span style="color:#323232;"> ((( </span><span style="color:#323232;"> ( </span><span style="color:#323232;"> ("community"."removed" = $3) AND ("post"."removed" = $4)) </span><span style="color:#323232;"> AND ("community_follower"."pending" IS NOT NULL) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> AND ("post"."nsfw" = $5) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> AND ("community"."nsfw" = $6) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> AND ("local_user_language"."language_id" IS NOT NULL) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> AND ("community_block"."person_id" IS NULL) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> AND ("person_block"."person_id" IS NULL) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> </span><span style="color:#323232;"> ORDER BY "post_aggregates"."featured_local" DESC , "post_aggregates"."hot_rank_active" DESC , "post_aggregates"."published" DESC </span><span style="color:#323232;"> </span><span style="color:#323232;"> LIMIT $7 </span><span style="color:#323232;"> OFFSET $8 </span><span style="color:#323232;"> ;` </span><span style="color:#323232;"> </span> That is with hand-optimized person_id = $1, which the Rust code does not do.
Just because it’s written in Rust doesn’t make your app safe, or performant.
Lemmy 0.18.4 listing posts, frequently via ORM Diesel:
<span style="color:#323232;"> SELECT "post"."id", "post"."name", "post"."url", "post"."body", "post"."creator_id", "post"."community_id", "post"."removed", </span><span style="color:#323232;"> "post"."locked", "post"."published", "post"."updated", "post"."deleted", "post"."nsfw", "post"."embed_title", "post"."embed_description", </span><span style="color:#323232;"> "post"."thumbnail_url", "post"."ap_id", "post"."local", "post"."embed_video_url", "post"."language_id", "post"."featured_community", </span><span style="color:#323232;"> "post"."featured_local", </span><span style="color:#323232;"> "person"."id", "person"."name", "person"."display_name", "person"."avatar", "person"."banned", "person"."published", "person"."updated", </span><span style="color:#323232;"> "person"."actor_id", "person"."bio", "person"."local", "person"."private_key", "person"."public_key", "person"."last_refreshed_at", </span><span style="color:#323232;"> "person"."banner", "person"."deleted", "person"."inbox_url", "person"."shared_inbox_url", "person"."matrix_user_id", </span><span style="color:#323232;"> "person"."admin", </span><span style="color:#323232;"> "person"."bot_account", "person"."ban_expires", "person"."instance_id", </span><span style="color:#323232;"> "community"."id", "community"."name", "community"."title", "community"."description", "community"."removed", "community"."published", </span><span style="color:#323232;"> "community"."updated", "community"."deleted", "community"."nsfw", "community"."actor_id", "community"."local", "community"."private_key", </span><span style="color:#323232;"> "community"."public_key", "community"."last_refreshed_at", "community"."icon", "community"."banner", "community"."followers_url", </span><span style="color:#323232;"> "community"."inbox_url", "community"."shared_inbox_url", "community"."hidden", "community"."posting_restricted_to_mods", </span><span style="color:#323232;"> "community"."instance_id", "community"."moderators_url", "community"."featured_url", </span><span style="color:#323232;"> ("community_person_ban"."id" IS NOT NULL), </span><span style="color:#323232;"> "post_aggregates"."id", "post_aggregates"."post_id", "post_aggregates"."comments", "post_aggregates"."score", "post_aggregates"."upvotes", </span><span style="color:#323232;"> "post_aggregates"."downvotes", "post_aggregates"."published", "post_aggregates"."newest_comment_time_necro", </span><span style="color:#323232;"> "post_aggregates"."newest_comment_time", "post_aggregates"."featured_community", "post_aggregates"."featured_local", </span><span style="color:#323232;"> "post_aggregates"."hot_rank", "post_aggregates"."hot_rank_active", "post_aggregates"."community_id", "post_aggregates"."creator_id", </span><span style="color:#323232;"> "post_aggregates"."controversy_rank", "community_follower"."pending", </span><span style="color:#323232;"> ("post_saved"."id" IS NOT NULL), </span><span style="color:#323232;"> ("post_read"."id" IS NOT NULL), </span><span style="color:#323232;"> ("person_block"."id" IS NOT NULL), </span><span style="color:#323232;"> "post_like"."score", </span><span style="color:#323232;"> coalesce(("post_aggregates"."comments" - "person_post_aggregates"."read_comments"), </span><span style="color:#323232;"> "post_aggregates"."comments") </span><span style="color:#323232;"> </span><span style="color:#323232;"> FROM (((((((((((( </span><span style="color:#323232;"> ("post_aggregates" </span><span style="color:#323232;"> INNER JOIN "person" ON ("post_aggregates"."creator_id" = "person"."id")) </span><span style="color:#323232;"> INNER JOIN "community" ON ("post_aggregates"."community_id" = "community"."id")) </span><span style="color:#323232;"> LEFT OUTER JOIN "community_person_ban" ON (("post_aggregates"."community_id" = "community_person_ban"."community_id") AND ("community_person_ban"."person_id" = "post_aggregates"."creator_id")) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> INNER JOIN "post" ON ("post_aggregates"."post_id" = "post"."id") </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "community_follower" ON (("post_aggregates"."community_id" = "community_follower"."community_id") AND ("community_follower"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "community_moderator" ON (("post"."community_id" = "community_moderator"."community_id") AND ("community_moderator"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "post_saved" ON (("post_aggregates"."post_id" = "post_saved"."post_id") AND ("post_saved"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "post_read" ON (("post_aggregates"."post_id" = "post_read"."post_id") AND ("post_read"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "person_block" ON (("post_aggregates"."creator_id" = "person_block"."target_id") AND ("person_block"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "post_like" ON (("post_aggregates"."post_id" = "post_like"."post_id") AND ("post_like"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "person_post_aggregates" ON (("post_aggregates"."post_id" = "person_post_aggregates"."post_id") AND ("person_post_aggregates"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "community_block" ON (("post_aggregates"."community_id" = "community_block"."community_id") AND ("community_block"."person_id" = $1)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> LEFT OUTER JOIN "local_user_language" ON (("post"."language_id" = "local_user_language"."language_id") AND ("local_user_language"."local_user_id" = $2)) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> </span><span style="color:#323232;"> WHERE </span><span style="color:#323232;"> ((( </span><span style="color:#323232;"> ((( </span><span style="color:#323232;"> ( </span><span style="color:#323232;"> ("community"."removed" = $3) AND ("post"."removed" = $4)) </span><span style="color:#323232;"> AND ("community_follower"."pending" IS NOT NULL) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> AND ("post"."nsfw" = $5) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> AND ("community"."nsfw" = $6) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> AND ("local_user_language"."language_id" IS NOT NULL) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> AND ("community_block"."person_id" IS NULL) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> AND ("person_block"."person_id" IS NULL) </span><span style="color:#323232;"> ) </span><span style="color:#323232;"> </span><span style="color:#323232;"> ORDER BY "post_aggregates"."featured_local" DESC , "post_aggregates"."hot_rank_active" DESC , "post_aggregates"."published" DESC </span><span style="color:#323232;"> </span><span style="color:#323232;"> LIMIT $7 </span><span style="color:#323232;"> OFFSET $8 </span><span style="color:#323232;"> ;` </span><span style="color:#323232;"> </span>
That is with hand-optimized person_id = $1, which the Rust code does not do.