<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://pashagolub.github.io/feed/by_tag/personal.xml" rel="self" type="application/atom+xml"/><link href="https://pashagolub.github.io/" rel="alternate" type="text/html" hreflang="en"/><updated>2026-04-29T10:08:24+00:00</updated><id>https://pashagolub.github.io/feed/by_tag/personal.xml</id><title type="html">blank</title><subtitle>A personal page with the blog and CV </subtitle><entry><title type="html">Stand Up, Mentor! Help Postgres Shine in GSoC 2026!</title><link href="https://pashagolub.github.io/blog/2026/GSoC-2026/" rel="alternate" type="text/html" title="Stand Up, Mentor! Help Postgres Shine in GSoC 2026!"/><published>2026-01-14T03:00:00+00:00</published><updated>2026-01-14T03:00:00+00:00</updated><id>https://pashagolub.github.io/blog/2026/GSoC-2026</id><content type="html" xml:base="https://pashagolub.github.io/blog/2026/GSoC-2026/"><![CDATA[<p>Google Summer of Code is back for 2026! We’re celebrating the <strong>22nd year</strong> of this incredible program that has brought countless talented developers into the open-source world. Please take a moment to review <a href="https://opensource.googleblog.com/2025/12/shape-future-with-google-summer-of-code.html">Google’s announcement</a> and familiarize yourself with what makes this year special.</p> <p>Now is the time to work on getting together a <strong>strong set of projects</strong> we’d like to have GSoC contributors work on over the summer. Like previous years, we must have an excellent Ideas list ready before the deadline for mentoring organizations. This list is the <strong>primary criterion</strong> Google uses to evaluate and accept us into the program.</p> <p>The deadline for Mentoring organizations to apply is <strong>February 3, 2026 at 18:00 UTC</strong>. The list of accepted organizations will be published on <strong>February 19</strong>. Here’s the complete timeline for your planning:</p> <p><strong>GSoC 2026 Timeline:</strong></p> <ul> <li><strong>January 19</strong>: Organization Applications Open</li> <li><strong>February 3 (18:00 UTC)</strong>: Deadline for Organization Applications</li> <li><strong>February 19</strong>: Accepted Organizations Announced</li> <li><strong>March 16 – 31</strong>: Contributor Application Period</li> <li><strong>April 2</strong>: Deadline for Final Proposals</li> <li><strong>May 4</strong>: Community Bonding Begins</li> </ul> <p>I’ve already created our <a href="https://wiki.postgresql.org/wiki/GSoC_2026">GSoC 2026 Ideas page</a> as our central hub for project submissions. The quality of this Ideas list will define the tone of our participation this year, so let’s make it outstanding!</p> <p><strong>What Makes a Great Project Idea?</strong></p> <p>Each project on our Ideas page should include these <strong>essential elements</strong>:</p> <ol> <li><strong>Project Title and Description</strong> (2-5 sentences that clearly explain the project)</li> <li><strong>Expected Outcomes</strong> (what will be delivered)</li> <li><strong>Required/Preferred Skills</strong> (programming languages, technologies, domain knowledge)</li> <li><strong>A potential mentor</strong> (two mentors are highly recommended)</li> <li><strong>Project Size</strong>: Small (90 hours), Medium (175 hours), or Large (350 hours)</li> <li><strong>Difficulty Rating</strong>: Easy, Medium, or Hard</li> </ol> <p><strong>Critical Guidelines to Remember:</strong></p> <p><strong>Never link to just a bug tracker</strong> as your project description. This leads to automatic rejection by Google. Keep descriptions high-level enough to allow contributor creativity, but avoid being vague. We want to inspire innovation while providing clear direction.</p> <p>We’re aiming for a diverse mix of projects including <strong>“Low-hanging fruit”</strong> for newcomers, <strong>“Core development”</strong> challenges for experienced contributors, and <strong>“Infrastructure”</strong> improvements that benefit the entire ecosystem.</p> <p><strong>PostgreSQL as an Umbrella Project</strong></p> <p>As with previous years, please consider PostgreSQL to be an <strong>“Umbrella” project</strong>. Anything that would be regarded as part of the <strong>“PostgreSQL Family”</strong> per our <a href="https://www.postgresql.org/about/policies/news-and-events/">News/Announce policy</a> is likely to be acceptable as a PostgreSQL GSoC project.</p> <p>This means if you’re a contributor or developer working on <strong>patroni, WAL-G, barman, pgBackRest, pgwatch, pgagroal, pgexporter, pgmoneta, pgpool, pgbouncer, the PostgreSQL website (pgweb), pgAdmin4, DBeaver, HeidiSQL, pldebugger, pspg, the JDBC driver, the ODBC driver</strong>, or any of the many other PostgreSQL Family projects, <strong>please feel free to add a project</strong> for consideration!</p> <p><strong>How You Can Help</strong></p> <p>Having at least <strong>two mentors per project</strong> is not just recommended but essential to decrease the individual load and provide better support to our contributors. Please consider listing yourself as a co-mentor for projects with only one mentor listed.</p> <p>If you have ideas from previous years that are still relevant, update them for 2026. Make sure to revise all the information, particularly listing yourself as a mentor and updating the project scope to be reasonable for the time contributors are given.</p> <p>New entries are absolutely welcome and encouraged! <a href="https://wiki.postgresql.org/wiki/GSoC_2025">Projects from last year</a> that were worked on but had significant follow-on work to be completed are also welcome just update the description appropriately.</p> <p><strong>Remember Our Greater Mission</strong></p> <p>The program’s goals extend far beyond code writing. One of our primary objectives is to <strong>inspire new developers to begin participating in open-source communities</strong> and help open-source projects identify and bring in new long-term contributors. Every mentor interaction is an opportunity to welcome someone into our wonderful PostgreSQL community.</p> <p>When we get closer to submitting our application, I’ll clean out any outdated entries that haven’t received updates. If any projects are no longer appropriate because they were completed independently, please feel free to remove them.</p> <p>Let’s make GSoC 2026 another fantastic year for PostgreSQL and our entire ecosystem! Your participation as mentors and project contributors is what makes this program successful year after year.</p> <p><strong>PGForce be with you!</strong></p> <p>Best regards,<br/> Pavlo Golub,<br/> on behalf of PostgreSQL GSoC Admins 💙💛</p>]]></content><author><name></name></author><category term="gsoc"/><category term="community"/><category term="postgresql"/><category term="personal"/><summary type="html"><![CDATA[Google Summer of Code is back for 2026! Celebrating the 22nd year of this incredible program.]]></summary></entry><entry><title type="html">Google Summer of Code 2025 - A Journey of Growth and Achievement!</title><link href="https://pashagolub.github.io/blog/2025/GSoC-2025-wrap-up/" rel="alternate" type="text/html" title="Google Summer of Code 2025 - A Journey of Growth and Achievement!"/><published>2025-11-17T06:00:00+00:00</published><updated>2025-11-17T06:00:00+00:00</updated><id>https://pashagolub.github.io/blog/2025/GSoC-2025-wrap-up</id><content type="html" xml:base="https://pashagolub.github.io/blog/2025/GSoC-2025-wrap-up/"><![CDATA[<p>What a journey! I’m very happy to announce that <strong>all seven</strong> Google Summer of Code 2025 contributors successfully passed their final evaluations and made great contributions to the PostgreSQL community! 🎉</p> <p>Back in May, I <a href="/2025/05/20/GSoC-2025-welcome-new-contributors/">welcomed these talented people</a> to our community. Now, six months later, I’m proud to celebrate not just the code they wrote, but the journey they made and the community members they’ve become.</p> <h2 id="a-year-like-no-other">A Year Like No Other</h2> <p>This year’s GSoC was something special. We received <strong>213 applications</strong> for the PostgreSQL organization alone—the highest number in our 21 years of participating in GSoC! But with this big number came challenges: a lot of spam and AI-generated applications made the selection process very difficult. We requested 9 project slots, but received only 7 because of program-wide limitations.</p> <p>But from those 213 applications, we found seven great people who achieved a 100% success rate. Not a single contributor failed to complete their project. Think about that for a moment. 💯</p> <h2 id="the-human-story-behind-the-code">The Human Story Behind the Code</h2> <p>What I like most about this year’s group isn’t just the great technical work—though there was a lot of it. It’s the personal growth, the determination, and the way each contributor became part of something bigger than themselves.</p> <p>Let me introduce you to our seven successful contributors and their remarkable journeys:</p> <p><strong><a href="https://github.com/pgmoneta/pgmoneta/discussions/631">Ashutosh Sharma</a></strong> worked on the difficult task of implementing incremental backup for PostgreSQL 13-16 in pgmoneta. So during the course of this program, he implemented an infrastructure that perform block-level incremental backups in pgmoneta for PostgreSQL versions 13‑16!</p> <p><strong><a href="https://gist.github.com/Mohab96/e10af7b60d140caa1927a52c7fbdf8bf">Mohab Yasser</a></strong> created pgmoneta-walfilter, a tool for precise WAL stream manipulation. His words say something important: <em>“This project provided deep exposure to PostgreSQL internals… Reading through PostgreSQL source code to understand WAL record formats was challenging but instructive.”</em> This is what GSoC is about—not just writing code, but becoming an expert in the process.</p> <p><strong><a href="https://gist.github.com/Userfrom1995/4bbea19edcba093207e092e6793cc113">Tejas Tyagi</a></strong> worked on pgagroal security improvements and described the GSoC experience very well: <em>“This experience has given me the confidence that I can work on and contribute to large, production-grade systems. I had no prior experience with connection poolers or many of the technologies I worked with, but through this project, I’ve developed skills that will serve me throughout my career.”</em></p> <p><strong><a href="https://bassamadnan.github.io/gsoc2025_report/">Bassam Adnan</a></strong> added extension support to pgexporter, implementing metrics for 15+ PostgreSQL extensions. His work on semantic versioning, HTTP API refactoring, and comprehensive testing demonstrates how one project can touch multiple areas and benefit multiple related projects.</p> <p><strong><a href="https://github.com/Gaurav05082002/PostgreSQL_GSOC/blob/main/Final-Report.md">Gaurav Patidar</a></strong> modernized pgwatch’s Grafana dashboards for v12. His systematic approach—creating Python scripts to detect deprecated components, then carefully refining each panel—shows the maturity needed for maintenance work that keeps projects accessible to users.</p> <p><strong><a href="https://blog.mankiratsingh.com/posts/baza-and-maza/">Mankirat Singh</a></strong> built an ABI compliance checker that now runs as “Baza” on the PostgreSQL BuildFarm. His journey from commit-by-commit checking to tag-based comparison, guided by community feedback, illustrates how GSoC teaches contributors to listen, adapt, and align with project needs.</p> <p><strong><a href="https://0xgouda.github.io/posts/my-postgresql-gsoc25-journey/work-and-results/">Ahmad Gouda</a></strong> enhanced pgwatch’s RPC integration, migrating from basic Go RPC to gRPC and implementing new sinks for ElasticSearch, Google Cloud pub/sub, and Apache Iceberg. His work shipped with pgwatch v4, demonstrating real-world impact.</p> <h2 id="beyond-the-technical-achievements">Beyond the Technical Achievements</h2> <p>The beauty of GSoC isn’t just in the code—it’s in the transformation of individuals into community members. Let me share what I observed:</p> <h3 id="community-bonding-that-actually-bonded">Community Bonding That Actually Bonded</h3> <p>Ahmad’s experience shows this very well. He found the PostgreSQL Hacking Discord channel and started attending monthly Hacking Workshops. He contributed to pg_duckdb, adding SQLSmith CI tests. He didn’t just work on his assigned project—he became part of the ecosystem.</p> <p>Several contributors attended conferences during or after their GSoC period. They presented their work, networked with other community members, and began building the relationships that sustain long-term contributions.</p> <h3 id="the-debugging-stories">The Debugging Stories</h3> <p>Some of my favorite moments were the “deep dive” debugging sessions:</p> <ul> <li>Mohab adding debug prints to PostgreSQL source code to understand WAL parsing and discovering that the issue wasn’t in <code class="language-plaintext highlighter-rouge">decode_xlog_record</code> but in how <code class="language-plaintext highlighter-rouge">pgmoneta_wal_parse_wal_file</code> calculated offsets</li> <li>Tejas tackling transaction pipeline bugs that only manifested with specific IO backends</li> <li>Mankirat learning Perl (a language he’d never used!) to write BuildFarm client modules</li> </ul> <p>These aren’t just technical challenges—they’re experiences that build character and create confident, capable contributors.</p> <h3 id="learning-new-languages-and-frameworks">Learning New Languages and Frameworks</h3> <p>Look at the diversity of technologies our contributors mastered:</p> <ul> <li>Mankirat learned Perl and CGI server setup</li> <li>Bassam worked extensively with C, HTTP protocols, and memory management</li> <li>Ahmad migrated systems from basic RPC to gRPC</li> <li>Tejas deep-dived into TLS/SSL protocols and certificate management</li> </ul> <p>Each contributor stepped outside their comfort zone, proving that passion and persistence matter more than prior expertise.</p> <h2 id="what-makes-a-successful-gsoc-experience">What Makes a Successful GSoC Experience?</h2> <p>Looking at this year’s group, I see several patterns:</p> <p><strong>Communication</strong>: Every successful contributor engaged actively—on GitHub discussions, mailing lists, Discord channels. They asked questions, provided updates, and sought feedback early and often.</p> <p><strong>Adaptability</strong>: Mankirat’s pivot from commit-by-commit to tag-based comparison, Ahmad’s migration to gRPC after discovering limitations in Go’s RPC—these weren’t failures, they were smart pivots based on community feedback.</p> <p><strong>Ownership</strong>: These contributors didn’t just implement features—they fixed bugs they encountered, improved documentation, and thought about long-term maintainability.</p> <p><strong>Community Integration</strong>: The best contributors didn’t work in isolation. They reviewed each other’s code, discussed approaches, and celebrated each other’s successes.</p> <h2 id="the-mentors-perspective">The Mentor’s Perspective</h2> <p>I want to share something that mentors often don’t say in public: <strong>we learn as much from contributors as they learn from us</strong>.</p> <p>This year’s contributors gave us fresh perspectives. They asked “why?” when we thought something was obvious. They suggested solutions we hadn’t thought about. They brought energy and enthusiasm that gave new life to projects.</p> <p>Several of this year’s mentors are GSoC alumni from previous years. This beautiful cycle—yesterday’s contributors becoming today’s mentors—is the lifeblood of our community.</p> <h2 id="the-numbers">The Numbers</h2> <p>While this post talks about the journey, let’s not forget the real impact:</p> <ul> <li><strong>7 contributors</strong>, all successful! 💯</li> <li><strong>30+ pull requests</strong> merged across multiple projects</li> <li>Code in <strong>production releases</strong> (pgwatch, pgmoneta, pgagroal, pgexporter)</li> <li>Work in <strong>C, Go, Python, Perl, Rust</strong></li> <li>Projects from <strong>backup systems</strong> to <strong>security improvements</strong> to <strong>monitoring tools</strong></li> </ul> <p>But these numbers tell only part of the story. Each line of code represents hours of learning, debugging, and growth.</p> <h2 id="challenges-we-faced">Challenges We Faced</h2> <p>This year had its problems. We faced:</p> <ul> <li>The biggest number of applications ever (213 for PostgreSQL alone!)</li> <li>A lot of spam and AI-generated applications</li> <li>Fewer slots than we wanted (7 instead of 9)</li> <li>Difficult coordination across distributed teams</li> </ul> <p>But every contributor kept going, showing great determination and adaptability.</p> <h2 id="a-call-to-action-we-need-you">A Call to Action: We Need You!</h2> <p>Here’s my most important message: <strong>we need more mentors!</strong></p> <p>The problem isn’t talented contributors—we had 213 applications this year! The problem is we don’t have enough mentors. <strong>The more mentors we have, the more projects we can support, the more contributors we can welcome, the stronger our community becomes.</strong></p> <p>If you’re an experienced PostgreSQL community member, consider becoming a mentor. You don’t need to be a core developer. You need:</p> <ul> <li>Experience with PostgreSQL and related tools</li> <li>Time to dedicate during the summer</li> <li>Patience and love for teaching</li> <li>Care for the community</li> </ul> <p>Mentoring is incredibly rewarding. You’ll:</p> <ul> <li>Shape the next generation of PostgreSQL contributors</li> <li>Learn from fresh perspectives</li> <li>Strengthen the ecosystem</li> <li>Make lasting connections</li> </ul> <p>Interested? Reach out to me or join our discussions on the mailing lists!</p> <h2 id="special-thanks">Special Thanks</h2> <p>A special acknowledgment to <strong>Jesper Pedersen</strong>, my co-admin for the GSoC program. It would be unreal to handle all this work without him! Jesper’s dedication, organizational skills, and mentorship across multiple projects were instrumental to our success.</p> <p>Thanks also to all the mentors who dedicated countless hours:</p> <ul> <li>Akshat Jaimini,</li> <li>Haoran Zhang,</li> <li>Saurav Pal,</li> <li>Rajiv Harlalka,</li> <li>David Wheeler,</li> <li>Luca Ferrari,</li> <li>Shahryar Soltanpour.</li> </ul> <p>And to the broader community who welcomed our contributors, answered questions, reviewed code, and provided encouragement—thank you!</p> <h2 id="looking-forward">Looking Forward</h2> <p>These seven contributors aren’t finished with PostgreSQL—they’re just getting started. Several have already expressed interest in continuing their work, attending conferences, and becoming long-term community members.</p> <p>Some of this year’s mentors are GSoC alumni from previous years, showing the beautiful cycle: yesterday’s contributors become today’s mentors, who help tomorrow’s contributors.</p> <h2 id="final-thoughts">Final Thoughts</h2> <p>GSoC 2025 wasn’t just about code merged and features shipped. It was about:</p> <ul> <li>Building confidence in young developers</li> <li>Growing a welcoming, inclusive community</li> <li>Showing PostgreSQL’s commitment to education</li> <li>Making paths for new people to contribute</li> </ul> <p>To our seven successful contributors: <strong>Congratulations!</strong> You’ve proven yourselves. You’ve shipped real code. You’ve joined a global community. You should be incredibly proud.</p> <p>To everyone reading this: If you’re inspired by these stories, if you want to contribute, if you see yourself in these projects—<strong>come join us!</strong> The PostgreSQL community welcomes you with open arms.</p> <p>Until next year’s GSoC, happy Postgres-ing! 💙💛</p>]]></content><author><name></name></author><category term="gsoc"/><category term="community"/><category term="postgresql"/><category term="personal"/><summary type="html"><![CDATA[All seven GSoC 2025 contributors successfully completed their projects! This is the story of their journey, the challenges they overcame, and what it means to welcome new members into our community.]]></summary></entry><entry><title type="html">Welcome new GSoC 2025 contributors!</title><link href="https://pashagolub.github.io/blog/2025/GSoC-2025-welcome-new-contributors/" rel="alternate" type="text/html" title="Welcome new GSoC 2025 contributors!"/><published>2025-05-20T06:00:00+00:00</published><updated>2025-05-20T06:00:00+00:00</updated><id>https://pashagolub.github.io/blog/2025/GSoC-2025-welcome-new-contributors</id><content type="html" xml:base="https://pashagolub.github.io/blog/2025/GSoC-2025-welcome-new-contributors/"><![CDATA[<p>I’m pleased to welcome seven new Google Summer of Code 2025 contributors to the Postgres community!</p> <p>I encourage you to welcome contributors during these first weeks to get them excited and invested in our community. You will meet them on <a href="https://www.postgresql.org/list/">mailing lists</a>, <a href="https://postgresteam.slack.com">Slack</a>, <a href="https://discord.gg/N7zU66vM">Discord</a>, and other media.</p> <p>The table below details information about this year’s project, contributors, and mentors!</p> <table> <thead> <tr> <th>Project Title</th> <th>Contributor</th> <th>Assigned Mentors</th> </tr> </thead> <tbody> <tr> <td><a href="https://summerofcode.withgoogle.com/programs/2025/projects/4Be9mT3p">Enhancements to pgwatch v3 RPC integration</a></td> <td>Ahmad Gouda</td> <td>Akshat Jaimini, Pavlo Golub</td> </tr> <tr> <td><a href="https://summerofcode.withgoogle.com/programs/2025/projects/HAmOi5Y7">pgmoneta: Incremental backup for PostgreSQL 13-16</a></td> <td>Ashutosh Sh</td> <td>Haoran Zhang, Jesper Pedersen</td> </tr> <tr> <td><a href="https://summerofcode.withgoogle.com/programs/2025/projects/AWQtfg8b">Extension Support for pgexporter</a></td> <td>Bassam Adnan</td> <td>Saurav Pal, Jesper Pedersen</td> </tr> <tr> <td><a href="https://summerofcode.withgoogle.com/programs/2025/projects/UhsBaCiE">Upgrade pgwatch Grafana dashboards to v11</a></td> <td>Gaurav Patidar</td> <td>Rajiv Harlalka, Pavlo Golub</td> </tr> <tr> <td><a href="https://summerofcode.withgoogle.com/programs/2025/projects/jFquLTUi">ABI Compliance Checker</a></td> <td>Mankirat Singh</td> <td>David Wheeler, Pavlo Golub</td> </tr> <tr> <td><a href="https://summerofcode.withgoogle.com/programs/2025/projects/ttqxjXNx">pgmoneta: WAL Filtering</a></td> <td>Mohab Yasser</td> <td>Shahryar Soltanpour, Jesper Pedersen</td> </tr> <tr> <td><a href="https://summerofcode.withgoogle.com/programs/2025/projects/ttqxjXNx">Enhancing Pgagroal Security</a></td> <td>Tejas Tyagi</td> <td>Luca Ferrari, Jesper Pedersen</td> </tr> </tbody> </table> <p>We expect GSoC contributors to actively participate in the Community Bonding period from May 8th to June 1st. This period’s goal is to prepare contributors to begin their project work effectively on June 2nd. So please help them accommodate.</p> <p>It was an insane start to the year! The GSoC program had the highest number of proposals ever, as well as the highest number of spam and AI-generated applications. Due to the high volume of new organizations and applications for the first time, on my memory, the PostgreSQL organization got only seven project slots out of 9!</p> <p>This year, there were 213 total applications to PostgreSQL org only (sic!), the highest number we’ve had in 21 years of #GSoC! I really appreciate the hard work of our mentors, especially those whose projects weren’t accepted this year. Also, I am glad and proud at the same time because several of this year’s mentors are GSoC alumni of previous years! Kudos to everyone and all of us!</p> <p>At the same time, I’m thankful to all the applicants who have spent their precious time! Please remember that despite not being part of the GSoC program this year, you are more than welcome in the PostgreSQL community! As a community, we will do our best to help you become a part of it.</p>]]></content><author><name></name></author><category term="gsoc"/><category term="community"/><category term="postgresql"/><category term="personal"/><summary type="html"><![CDATA[I'm pleased to welcome seven new Google Summer of Code 2025 contributors to the Postgres community!]]></summary></entry><entry><title type="html">PostgreSQL Accepted as a Mentoring Organization for Google Summer of Code 2025!</title><link href="https://pashagolub.github.io/blog/2025/GSoC-2025-accepted/" rel="alternate" type="text/html" title="PostgreSQL Accepted as a Mentoring Organization for Google Summer of Code 2025!"/><published>2025-02-28T06:00:00+00:00</published><updated>2025-02-28T06:00:00+00:00</updated><id>https://pashagolub.github.io/blog/2025/GSoC-2025-accepted</id><content type="html" xml:base="https://pashagolub.github.io/blog/2025/GSoC-2025-accepted/"><![CDATA[<p>We are thrilled to announce that <strong>PostgreSQL</strong> has been selected as one of the <strong>185 open-source projects</strong> participating in the <strong>21st year of Google Summer of Code (GSoC)</strong>! This is an exciting opportunity for us to collaborate with new contributors and continue enhancing the PostgreSQL ecosystem.</p> <h2 id="join-us-as-a-gsoc-contributor">Join Us as a GSoC Contributor</h2> <p>If you’re passionate about open-source development and eager to work on PostgreSQL projects, here’s how you can get involved:</p> <ul> <li> <p><strong>Application Period</strong>: 🗓️ <em>March 24 - April 8, 2025</em></p> </li> <li><strong>Steps to Apply</strong>: <ol> <li><strong>Explore Our Project Ideas</strong>: Visit our <a href="https://wiki.postgresql.org/wiki/GSoC_2025">GSoC wiki page</a> to find project ideas that align with your interests and skills.</li> <li><strong>Connect with Us</strong>: Reach out through our preferred <a href="https://wiki.postgresql.org/wiki/GSoC">communication channels</a> to discuss project ideas and ask questions.</li> <li><strong>Prepare Your Proposal</strong>: Use the insights from your interactions to craft a strong project proposal.</li> </ol> </li> <li><strong>Resources</strong>: <ul> <li><a href="https://youtube.com/watch?v=Wxjxwx7mqaI&amp;feature=shared">Introduction to GSoC Video</a></li> <li><a href="https://google.github.io/gsocguides/student/">Contributor Guide</a></li> <li><a href="https://developers.google.com/open-source/gsoc/help/student-advice">Advice for Applying to GSoC</a></li> </ul> </li> </ul> <h2 id="upcoming-info-session">Upcoming Info Session</h2> <p>To assist prospective contributors, GSoC team will be hosting an information session on <em>Thursday, March 6, 16:00 UTC</em>. <a href="https://meet.google.com/gyq-mcuz-wey">Join the talk here</a>!</p> <h2 id="lets-make-2025-a-milestone-year">Let’s Make 2025 a Milestone Year!</h2> <p>Building on the success of previous years, we are eager to welcome a diverse group of contributors to the PostgreSQL community. Whether you’re a student or a beginner in open-source development, GSoC 2025 is a fantastic opportunity to gain real-world experience and make meaningful contributions.</p> <p>Stay tuned for more updates, and let’s make this year unforgettable!</p> <p><em>For more details, visit the <a href="https://opensource.googleblog.com/2025/02/meet-mentoring-organizations-of-gsoc.html">official GSoC announcement</a>.</em></p> <p>🚀 Let’s code, collaborate, and innovate together!</p>]]></content><author><name></name></author><category term="gsoc"/><category term="community"/><category term="postgresql"/><category term="personal"/><summary type="html"><![CDATA[We are thrilled to announce that **PostgreSQL** has been selected as one of the **185 open-source projects** participating in the **21st year of Google Summer of Code (GSoC)**! This is an exciting opportunity for us to collaborate with new contributors and continue enhancing the PostgreSQL ecosystem.]]></summary></entry><entry><title type="html">FOSDEM 2025: A PostgreSQL Community Tradition</title><link href="https://pashagolub.github.io/blog/2025/fosdem2025/" rel="alternate" type="text/html" title="FOSDEM 2025: A PostgreSQL Community Tradition"/><published>2025-02-07T06:00:00+00:00</published><updated>2025-02-07T06:00:00+00:00</updated><id>https://pashagolub.github.io/blog/2025/fosdem2025</id><content type="html" xml:base="https://pashagolub.github.io/blog/2025/fosdem2025/"><![CDATA[<h2 id="introduction">Introduction</h2> <p>FOSDEM has long been a key event for the PostgreSQL community, and 2025 was no exception. Every year, PostgreSQL developers, contributors, and users worldwide gather in Brussels for a week packed with talks, meetings, and discussions. Our community has a strong tradition at FOSDEM, with a dedicated developer room, a booth, and numerous side events</p> <p>One of the most recognizable FOSDEM traditions is <strong>FOSDEM Weather</strong> — a perfect mix of rain, cold, and clouds that always greets us in Brussels. Over the years, we even started selling PostgreSQL-branded umbrellas at our booth, and you could track the weather by watching the sales spike! But this year, for the first time in a while, the weather was <strong>sunny and perfect</strong> — so we joked that the weather was trying to lower our sales. 😄</p> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/img/postgres-booth-fosdem-2025-480.webp 480w,/assets/img/postgres-booth-fosdem-2025-800.webp 800w,/assets/img/postgres-booth-fosdem-2025-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/img/postgres-booth-fosdem-2025.jpg" class="img-fluid rounded z-depth-1" width="100%" height="auto" loading="eager" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure> <h2 id="a-busy-week-for-postgresql">A Busy Week for PostgreSQL</h2> <p>FOSDEM week is always busy for the PostgreSQL community, with multiple events happening alongside the main conference:</p> <h3 id="p2d2-conference"><strong>P2D2 Conference</strong></h3> <p>Held earlier in the week, the <strong>Prague PostgreSQL Developer Day (P2D2)</strong> is a major PostgreSQL event that gathers experts for in-depth discussions. For a detailed experience of the event, check out <a href="https://www.cybertec-postgresql.com/en/my-first-experience-at-p2d2/">Ants Aasma’s blog post</a>.</p> <h3 id="postgresql-developer-meeting"><strong>PostgreSQL Developer Meeting</strong></h3> <p>On <strong>Thursday, January 30th</strong>, PostgreSQL core developers and contributors held a private developer meeting to discuss ongoing projects, significant challenges, and future PostgreSQL development. More details can be found on the <a href="https://2025.fosdempgday.org/devmeeting/">official event page</a>.</p> <h3 id="fosdem-pgday"><strong>FOSDEM PGDay</strong></h3> <p>On <strong>Friday, January 31st</strong>, we had <strong>FOSDEM PGDay</strong>, a full-day PostgreSQL conference. The schedule featured talks on a wide range of PostgreSQL topics, from performance tuning to backups and new features. The complete schedule is available <a href="https://www.postgresql.eu/events/fosdem2025/schedule/">here</a>.</p> <h3 id="postgresql-devroom-at-fosdem"><strong>PostgreSQL Devroom at FOSDEM</strong></h3> <p>The <strong>PostgreSQL Devroom</strong> took place on <strong>Sunday, February 2nd</strong>, featuring sessions on database performance, replication, analytics, AI/ML, and more. This year, we had great discussions about PostgreSQL internals, best practices, and real-world use cases. You can find the complete session list <a href="https://fosdem.org/2025/schedule/track/postgresql/">here</a>. The talk records will be available shortly.</p> <h2 id="community--networking">Community &amp; Networking</h2> <p>FOSDEM is not just about talks—it’s about meeting people, sharing ideas, and strengthening the community. As usual, there were plenty of social events and informal gatherings.</p> <p>One of the highlights for me was attending the <strong>Google Summer of Code (GSoC) event on Saturday evening</strong>, where I had the chance to meet new and long-time friends. GSoC continues to be an essential program for PostgreSQL, and it was great to see the enthusiasm for mentoring and open-source contributions. Right now, PostgreSQL org is gathering <a href="https://wiki.postgresql.org/wiki/GSoC_2025">project ideas and mentors</a>. If you want to be a mentor, you still have time until February 10th!</p> <h2 id="contributions--recognition">Contributions &amp; Recognition</h2> <p>This year’s central topic of discussion was <strong>contributions</strong>: what counts as a contribution, how we measure it, and how we recognize non-code contributions. Our community relies on the work of many people beyond just developers: event organizers, documentation writers, speakers, translators, and advocates all play a massive role in making PostgreSQL what it is today.</p> <p>To help highlight and recognize these contributions, we put a lot of effort into building our new website: <strong><a href="https://postgres-contrib.org/">postgres-contrib.org</a></strong>. This platform helps track contributions and provides a way to nominate and recognize those who support the community.</p> <h2 id="closing-thoughts">Closing Thoughts</h2> <p>The <strong>spirit of the PostgreSQL community</strong> is what makes FOSDEM so special every year. I want to extend my <strong>huge thanks</strong> to all the volunteers, organizers, and contributors who made this event possible.</p> <p>Special thanks to:</p> <ul> <li>The <a href="https://2025.fosdempgday.org/callforpapers/">Call for Papers team</a> (which I was part of) for reviewing and selecting the talks.</li> <li>All <strong>speakers</strong> who shared their knowledge.</li> <li>The <strong>attendees</strong> who made the devroom lively and interactive.</li> </ul> <p>A special shoutout to <strong>volunteers</strong>, both scheduled and spontaneous. While we had a volunteer schedule for the booth, many community members stepped up to help when needed. For example, <strong>Bruce Momjian</strong> spent hours assisting visitors at the booth, helping find PostgreSQL T-shirts and hoodies in the correct sizes. And <strong>Ants Aasma</strong> helped a team of bouncers (well, pg bouncers, if you know what I mean ;) ). Many others did the same, proving once again that our community is built on <strong>collaboration and generosity</strong>.</p> <p>We had a fantastic time at FOSDEM 2025, and I can’t wait to do it all again next year!</p> <p>Until then, keep contributing and keep the PostgreSQL spirit alive! 🚀</p> <figure> <picture> <source class="responsive-img-srcset" srcset="/assets/img/pavlo-golub-fosdem-2025-480.webp 480w,/assets/img/pavlo-golub-fosdem-2025-800.webp 800w,/assets/img/pavlo-golub-fosdem-2025-1400.webp 1400w," type="image/webp" sizes="95vw"/> <img src="/assets/img/pavlo-golub-fosdem-2025.jpg" class="img-fluid rounded z-depth-1" width="100%" height="auto" loading="eager" onerror="this.onerror=null; $('.responsive-img-srcset').remove();"/> </picture> </figure>]]></content><author><name></name></author><category term="community"/><category term="fosdem"/><category term="events"/><category term="postgresql"/><category term="personal"/><summary type="html"><![CDATA[FOSDEM has long been a key event for the PostgreSQL community, and 2025 was no exception. Every year, PostgreSQL developers, contributors, and users worldwide gather in Brussels for a week packed with talks, meetings, and discussions. Our community has a strong tradition at FOSDEM, with a dedicated developer room, a booth, and numerous side events]]></summary></entry><entry><title type="html">Join PostgreSQL in Google Summer of Code 2025!</title><link href="https://pashagolub.github.io/blog/2025/GSoC-2025/" rel="alternate" type="text/html" title="Join PostgreSQL in Google Summer of Code 2025!"/><published>2025-01-29T06:00:00+00:00</published><updated>2025-01-29T06:00:00+00:00</updated><id>https://pashagolub.github.io/blog/2025/GSoC-2025</id><content type="html" xml:base="https://pashagolub.github.io/blog/2025/GSoC-2025/"><![CDATA[<h2 id="a-legacy-of-postgresql-in-gsoc">A Legacy of PostgreSQL in GSoC</h2> <p>Google Summer of Code 2025 is here, and PostgreSQL is once again proud to participate in this amazing program! Over the years, many talented contributors have started their PostgreSQL journey through GSoC, with some becoming long-term members of our community. Their commitment has helped improve PostgreSQL and its ecosystem, making this program an essential part of our growth and innovation.</p> <p>Looking ahead, we are excited for new ideas, fresh contributors, and more diversity in projects, mentors, and mentees. PostgreSQL welcomes everyone who wants to contribute and learn, and we encourage <strong>both new and experienced community members to get involved</strong>.</p> <h2 id="whats-new-for-gsoc-2025">What’s New for GSoC 2025?</h2> <p>This year, the GSoC team is particularly <strong>looking to support more security and AI/ML projects</strong>. If you know of an <strong>AI/ML or security-focused open-source project</strong>, encourage them to apply for GSoC 2025!</p> <h2 id="who-can-participate">Who Can Participate?</h2> <p>GSoC is open to <strong>students and newcomers to open-source development</strong>, making it an excellent opportunity for those looking to get involved with PostgreSQL. Whether you’re interested in database internals, extensions, drivers, performance tools, or UI development, there’s a place for you in the PostgreSQL ecosystem.</p> <p><strong>Key Dates:</strong></p> <ul> <li><strong>Mentoring organization applications are open now</strong> at <a href="https://g.co/gsoc">g.co/gsoc</a> and close <strong>February 11, 2025, at 18:00 UTC</strong>.</li> <li>If you’re interested in becoming a mentor, now is the time to reach out to us!</li> <li>It’s time to collect project ideas and update the <a href="https://wiki.postgresql.org/wiki/GSoC_2025">GSoC 2025 Ideas page</a>.</li> <li>Read the <a href="https://google.github.io/gsocguides/mentor/">GSoC Mentor Guide</a> for useful tips.</li> </ul> <h2 id="project-ideas-and-mentorship">Project Ideas and Mentorship</h2> <p>The <strong>most important part of our application as a mentoring organization</strong> is having a <strong>well-defined list of project ideas</strong>. These projects should take approximately:</p> <ul> <li><strong>90 hours</strong> (small project),</li> <li><strong>175 hours</strong> (medium project),</li> <li><strong>350 hours</strong> (large project).</li> </ul> <p>We encourage <strong>all PostgreSQL community members</strong> to submit project ideas and volunteer as mentors. Mentorship is essential for growing our community, sharing knowledge, and integrating new contributors into PostgreSQL development.</p> <h2 id="meet-us-at-fosdem">Meet Us at FOSDEM</h2> <p>Want to discuss project ideas or mentorship opportunities in person?<br/> <strong>Let’s talk during <a href="https://andreas.scherbaum.la/post/2025-01-20_postgresql-at-fosdem-2025/">FOSDEM</a> this week!</strong> PostgreSQL will have a booth and a devroom, so there will be plenty of opportunities to connect.</p> <p>Also, a few members of the <strong>Google Open Source team</strong> will be at FOSDEM carrying <strong>GSoC pennant flags and blue GSoC beanies</strong>. You can find them:</p> <ul> <li><strong>Upper level of Building K, near the large glass doors</strong></li> <li><strong>Saturday &amp; Sunday from 11:00–14:00</strong></li> </ul> <p>Stop by and say hi if you’re interested in GSoC!</p> <h2 id="apply-now--spread-the-word">Apply Now &amp; Spread the Word</h2> <p>As with last year, please consider PostgreSQL to be an <strong>“Umbrella”</strong> project, and anything that would be regarded as a <strong>“PostgreSQL Family”</strong> per the <a href="https://www.postgresql.org/about/policies/news-and-events/">News/Announce policy</a> is likely to be acceptable as a PostgreSQL GSoC project.</p> <p>In other words, if you’re a contributor or developer on WAL-G, barman, pgBackRest, pgwatch, pgagroal, pgexporter, pgmoneta, pgpool, pgbouncer, the PostgreSQL website (pgweb), the PgEU/PgUS website code (pgeu-system), pgAdmin4, DBeaver, HeidiSQL, pldebugger, pspg, the PG RPMs (pgrpms), the JDBC driver, the ODBC driver, or any of the many other PG Family projects, please feel free to add a project for consideration!</p> <p>We need:</p> <ul> <li><strong>Project ideas</strong> that fit the GSoC guidelines.</li> <li><strong>Mentors</strong> to help guide contributors.</li> <li><strong>New contributors</strong> looking to get involved.</li> <li><strong>Community support</strong> to spread awareness.</li> </ul> <h3 id="next-steps">Next Steps</h3> <ul> <li>Read the <a href="https://google.github.io/gsocguides/mentor/">GSoC Mentor Guide</a> and <a href="https://developers.google.com/open-source/gsoc/faq">FAQs</a>.</li> <li><strong>Encourage other open-source projects</strong> to apply! If you know of an open-source org that might be a good fit, remind them to check out the <a href="https://developers.google.com/open-source/gsoc/resources">GSoC resources</a> and use us as a reference.</li> </ul> <p>Let’s make GSoC 2025 another successful year for PostgreSQL and open-source innovation! 🚀</p> <p>Best regards,<br/> Pavlo Golub,<br/> on behalf of PostgreSQL GSoC Admins 💙💛</p>]]></content><author><name></name></author><category term="gsoc"/><category term="community"/><category term="postgresql"/><category term="personal"/><summary type="html"><![CDATA[Google Summer of Code is back for 2025!]]></summary></entry><entry><title type="html">How to use PostgreSQL for (military) geoanalytics tasks by Taras Klioba</title><link href="https://pashagolub.github.io/blog/2024/taras-klioba-postgis-in-warfare/" rel="alternate" type="text/html" title="How to use PostgreSQL for (military) geoanalytics tasks by Taras Klioba"/><published>2024-03-05T13:00:00+00:00</published><updated>2024-03-05T13:00:00+00:00</updated><id>https://pashagolub.github.io/blog/2024/taras-klioba-postgis-in-warfare</id><content type="html" xml:base="https://pashagolub.github.io/blog/2024/taras-klioba-postgis-in-warfare/"><![CDATA[<p>During the <a href="https://www.postgresql.eu/events/pgconfeu2023/schedule/session/4605-from-map-to-reality-using-postgis-in-warfare/">PGConf.EU 2023</a>, my friend, colleague, and PostgreSQL Ukraine co-founder <a href="https://www.linkedin.com/in/kloba/">Taras Klioba</a> delved into the fascinating intersection of geospatial analysis and modern warfare.</p> <p>He decided not to publish a video record of his talk for obvious reasons. But now, he has shared the essential details of his talk in the form of a <a href="https://klioba.com/how-to-use-postgresql-for-military-geoanalytics-tasks">blog article</a>. I want to boost this blog post for all Planet Postgres readers; that’s the primary purpose of the text you’re reading.</p> <p>Taras’s article discusses the importance of geoanalytics in military operations due to the prevalence of geospatial data, focusing on utilizing PostgreSQL to process such data. It addresses everyday geoanalytical tasks such as finding K-nearest objects, distance calculations, and point within a polygon determination. It aims to provide practical examples and tips. Open-source data, specifically russian military facility data from <a href="https://www.openstreetmap.org/">OpenStreetMap</a>, is used as a primary dataset. It is then imported into PostgreSQL using the <a href="https://osm2pgsql.org/">osm2pgsql</a> tool for analysis and optimization.</p> <p>Additionally, fire data from NASA satellites is introduced as a second data source, sourced from the <a href="https://www.earthdata.nasa.gov/learn/find-data/near-real-time/firms/vj114imgtdlnrt">Fire Information for Resource Management System</a> (FIRMS). FIRMS allows real-time monitoring of active fires worldwide, including within russian military facilities’ territory since 2022. The process involves downloading fire data using a specific script and importing it into a PostgreSQL database for further analysis.</p> <p>For example, the text outlines a task of finding the K-nearest neighbors, precisely ten fires near the Shahed production plant in russia, known for manufacturing Iranian Shahed drones. It refers to previous <a href="https://molfar.com/blog/alabuga-deanon">research by the Molfar team</a> for detailed information about the factory, located in the special economic zone Alabuga in Tatarstan. The text highlights the shift in factory priorities towards drone production following sanctions. It proposes a method involving creating a buffer around the target area and recursively expanding it until the desired results are obtained.</p> <p>Please, read and share! Glory to Ukraine! 💙💛</p>]]></content><author><name></name></author><category term="postgis"/><category term="pgconf"/><category term="postgresql"/><category term="personal"/><summary type="html"><![CDATA[During the PGConf.EU 2023, my friend, colleague, and PostgreSQL Ukraine co-founder Taras Klioba delved into the fascinating intersection of geospatial analysis and modern warfare. He decided not to publish a video record of his talk for obvious reasons. But now, he has shared the essential details of his talk in the form of a blog article. I want to boost this blog post for all Planet Postgres readers; that's the primary purpose of the text you're reading.]]></summary></entry><entry><title type="html">pgxmock v4 is out! Mocking batches for PostgreSQL in Go!</title><link href="https://pashagolub.github.io/blog/2024/pgxmock-v4/" rel="alternate" type="text/html" title="pgxmock v4 is out! Mocking batches for PostgreSQL in Go!"/><published>2024-03-05T13:00:00+00:00</published><updated>2024-03-05T13:00:00+00:00</updated><id>https://pashagolub.github.io/blog/2024/pgxmock-v4</id><content type="html" xml:base="https://pashagolub.github.io/blog/2024/pgxmock-v4/"><![CDATA[<p>I am excited to announce the update of <strong><a href="https://github.com/pashagolub/pgxmock/releases/">pgxmock v4</a></strong>! This update adds long awaited support for <code class="language-plaintext highlighter-rouge">pgx.Batch</code> and completely rewrites the <code class="language-plaintext highlighter-rouge">Prepare</code> and <code class="language-plaintext highlighter-rouge">Deallocate</code> mocking implementation.</p> <h2 id="what-are-batches">What are Batches?</h2> <p><a href="https://pkg.go.dev/github.com/jackc/pgx/v5#Batch">Batch queries</a> in <strong>pgx</strong> are a way of bundling multiple queries together to avoid unnecessary network round trips. A <code class="language-plaintext highlighter-rouge">Batch</code> must only be sent once. One can define a function to deal with the results of every query, e.g.</p> <div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">batch</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="n">pgx</span><span class="o">.</span><span class="n">Batch</span><span class="p">{}</span>
  <span class="n">batch</span><span class="o">.</span><span class="n">Queue</span><span class="p">(</span><span class="s">"select some_func()"</span><span class="p">)</span><span class="o">.</span><span class="n">QueryRow</span><span class="p">(</span><span class="k">func</span><span class="p">(</span><span class="n">row</span> <span class="n">pgx</span><span class="o">.</span><span class="n">Row</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
    <span class="k">var</span> <span class="n">n</span> <span class="kt">int32</span>
    <span class="n">err</span> <span class="o">:=</span> <span class="n">row</span><span class="o">.</span><span class="n">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="n">n</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
      <span class="k">return</span> <span class="n">err</span>
    <span class="p">}</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">err</span>
  <span class="p">})</span>

  <span class="n">batch</span><span class="o">.</span><span class="n">Queue</span><span class="p">(</span><span class="s">"select * from foo*"</span><span class="p">)</span><span class="o">.</span><span class="n">Query</span><span class="p">(</span><span class="k">func</span><span class="p">(</span><span class="n">rows</span> <span class="n">pgx</span><span class="o">.</span><span class="n">Rows</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
    <span class="c">// ...</span>
  <span class="p">})</span>

  <span class="n">batch</span><span class="o">.</span><span class="n">Queue</span><span class="p">(</span><span class="s">"update foo set bar = 'zoo' where id = 1"</span><span class="p">)</span><span class="o">.</span><span class="n">Exec</span><span class="p">(</span><span class="k">func</span><span class="p">(</span><span class="n">ct</span> <span class="n">pgconn</span><span class="o">.</span><span class="n">CommandTag</span><span class="p">)</span> <span class="p">(</span><span class="n">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="n">ct</span><span class="o">.</span><span class="n">RowsAffected</span><span class="p">()</span> <span class="o">!=</span> <span class="m">1</span> <span class="p">{</span>
      <span class="n">err</span> <span class="o">=</span> <span class="n">errors</span><span class="o">.</span><span class="n">New</span><span class="p">(</span><span class="s">"expected 1 row to be affected"</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">return</span>
  <span class="p">})</span>

  <span class="n">err</span> <span class="o">=</span> <span class="n">conn</span><span class="o">.</span><span class="n">SendBatch</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">batch</span><span class="p">)</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>
</code></pre></div></div> <p>If a developer wants to have more control over result checking, they can use explicit way. This way the example above transforms to</p> <div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="n">batch</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="n">pgx</span><span class="o">.</span><span class="n">Batch</span><span class="p">{}</span>
  <span class="n">batch</span><span class="o">.</span><span class="n">Queue</span><span class="p">(</span><span class="s">"select some_func()"</span><span class="p">)</span>
  <span class="n">batch</span><span class="o">.</span><span class="n">Queue</span><span class="p">(</span><span class="s">"select * from foo*"</span><span class="p">)</span>
  <span class="n">batch</span><span class="o">.</span><span class="n">Queue</span><span class="p">(</span><span class="s">"update foo set bar = 'zoo' where id = 1"</span><span class="p">)</span>
  <span class="n">br</span> <span class="o">:=</span> <span class="n">mock</span><span class="o">.</span><span class="n">SendBatch</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">batch</span><span class="p">)</span>

  <span class="c">// process results</span>
  <span class="k">var</span> <span class="n">n</span> <span class="kt">int32</span>
  <span class="n">err</span> <span class="o">:=</span> <span class="n">br</span><span class="o">.</span><span class="n">QueryRow</span><span class="p">()</span><span class="o">.</span><span class="n">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="n">n</span><span class="p">)</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
    <span class="nb">panic</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span>
  <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>

  <span class="n">rows</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">br</span><span class="o">.</span><span class="n">Query</span><span class="p">()</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
    <span class="nb">panic</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span>
  <span class="c">// ... process rows here</span>

  <span class="n">ct</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">br</span><span class="o">.</span><span class="n">Exec</span><span class="p">()</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
    <span class="nb">panic</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span>
  <span class="k">if</span> <span class="o">!</span><span class="n">ct</span><span class="o">.</span><span class="n">Update</span><span class="p">()</span> <span class="o">||</span> <span class="m">1</span> <span class="o">==</span> <span class="n">ct</span><span class="o">.</span><span class="n">RowsAffected</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"something bad happened"</span><span class="p">)</span>
  <span class="p">}</span>

  <span class="n">err</span> <span class="o">:=</span> <span class="n">br</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>
  <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
    <span class="nb">panic</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="p">}</span>
</code></pre></div></div> <h2 id="and-how-am-i-supposed-to-test-batches-with-pgxmock">And how am I supposed to test batches with pgxmock?</h2> <p>Really simple. Just as everything else. First, you define you expectations! Second, you call your function with a mock as an argument! And finally, you check if all expectations were met and if your code reacted as expected.</p> <p>Let’s imagine we have a function to test</p> <div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">processBatch</span><span class="p">(</span><span class="n">db</span> <span class="n">pgx</span><span class="o">.</span><span class="n">Tx</span><span class="p">)</span> <span class="n">err</span> <span class="p">{</span>
  <span class="n">batch</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="n">pgx</span><span class="o">.</span><span class="n">Batch</span><span class="p">{}</span>
  <span class="n">batch</span><span class="o">.</span><span class="n">Queue</span><span class="p">(</span><span class="s">"select 1 + 1"</span><span class="p">)</span><span class="o">.</span><span class="n">QueryRow</span><span class="p">(</span><span class="k">func</span><span class="p">(</span><span class="n">row</span> <span class="n">pgx</span><span class="o">.</span><span class="n">Row</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
    <span class="k">var</span> <span class="n">n</span> <span class="kt">int32</span>
    <span class="k">return</span> <span class="n">row</span><span class="o">.</span><span class="n">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="n">n</span><span class="p">)</span>
  <span class="p">})</span>
  <span class="n">batch</span><span class="o">.</span><span class="n">Queue</span><span class="p">(</span><span class="s">"update users set active = $1 where id = $2"</span><span class="p">,</span> <span class="no">true</span><span class="p">,</span> <span class="m">1</span><span class="p">)</span><span class="o">.</span><span class="n">Exec</span><span class="p">(</span><span class="k">func</span><span class="p">(</span><span class="n">ct</span> <span class="n">pgconn</span><span class="o">.</span><span class="n">CommandTag</span><span class="p">)</span> <span class="p">(</span><span class="n">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="n">ct</span><span class="o">.</span><span class="n">RowsAffected</span><span class="p">()</span> <span class="o">!=</span> <span class="m">1</span> <span class="p">{</span>
      <span class="n">err</span> <span class="o">=</span> <span class="n">errors</span><span class="o">.</span><span class="n">New</span><span class="p">(</span><span class="s">"expected 1 row to be affected"</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">return</span>
  <span class="p">})</span>
  <span class="k">return</span> <span class="n">db</span><span class="o">.</span><span class="n">SendBatch</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">batch</span><span class="p">)</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">TestBatch</span><span class="p">(</span><span class="n">t</span> <span class="o">*</span><span class="n">testing</span><span class="o">.</span><span class="n">T</span><span class="p">)</span> <span class="p">{</span>
  <span class="n">t</span><span class="o">.</span><span class="n">Parallel</span><span class="p">()</span>
  <span class="n">mock</span><span class="p">,</span> <span class="n">_</span> <span class="o">:=</span> <span class="n">NewConn</span><span class="p">()</span>
  <span class="n">a</span> <span class="o">:=</span> <span class="n">assert</span><span class="o">.</span><span class="n">New</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>

  <span class="c">// define our expectations</span>
  <span class="n">eb</span> <span class="o">:=</span> <span class="n">mock</span><span class="o">.</span><span class="n">ExpectBatch</span><span class="p">()</span>
  <span class="n">eb</span><span class="o">.</span><span class="n">ExpectQuery</span><span class="p">(</span><span class="s">"select"</span><span class="p">)</span><span class="o">.</span><span class="n">WillReturnRows</span><span class="p">(</span><span class="n">NewRows</span><span class="p">([]</span><span class="kt">string</span><span class="p">{</span><span class="s">"sum"</span><span class="p">})</span><span class="o">.</span><span class="n">AddRow</span><span class="p">(</span><span class="m">2</span><span class="p">))</span>
  <span class="n">eb</span><span class="o">.</span><span class="n">ExpectExec</span><span class="p">(</span><span class="s">"update"</span><span class="p">)</span><span class="o">.</span><span class="n">WithArgs</span><span class="p">(</span><span class="no">true</span><span class="p">,</span> <span class="m">1</span><span class="p">)</span><span class="o">.</span><span class="n">WillReturnResult</span><span class="p">(</span><span class="n">NewResult</span><span class="p">(</span><span class="s">"UPDATE"</span><span class="p">,</span> <span class="m">1</span><span class="p">))</span>

  <span class="c">// run the test</span>
  <span class="n">err</span> <span class="o">:=</span> <span class="n">processBatch</span><span class="p">(</span><span class="n">mock</span><span class="p">)</span>

  <span class="c">// check our expectations and code behaviour</span>
  <span class="n">a</span><span class="o">.</span><span class="n">NoError</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
  <span class="n">a</span><span class="o">.</span><span class="n">NoError</span><span class="p">(</span><span class="n">mock</span><span class="o">.</span><span class="n">ExpectationsWereMet</span><span class="p">())</span>
<span class="p">}</span>
</code></pre></div></div> <p>Check <a href="https://github.com/pashagolub/pgxmock/blob/master/batch_test.go">pgxmock test cases</a> to know more!</p> <h2 id="what-about-prepare-and-deallocate">What about <code class="language-plaintext highlighter-rouge">Prepare</code> and <code class="language-plaintext highlighter-rouge">Deallocate</code>?</h2> <p>Since <strong>pgx</strong> doesn’t have a special struct to handle prepared statements, I simplified the <code class="language-plaintext highlighter-rouge">ExpectPrepare</code> struct in pgxmock. Instead of this</p> <div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="n">mock</span><span class="o">.</span><span class="n">ExpectPrepare</span><span class="p">(</span><span class="s">"articles_stmt"</span><span class="p">,</span> <span class="s">"SELECT (.+) FROM articles WHERE id = ?"</span><span class="p">)</span><span class="o">.</span>
    <span class="n">ExpectQuery</span><span class="p">()</span><span class="o">.</span>
    <span class="n">WithArgs</span><span class="p">(</span><span class="m">1</span><span class="p">)</span><span class="o">.</span>
    <span class="n">WillReturnRows</span><span class="p">(</span><span class="n">NewRows</span><span class="p">([]</span><span class="kt">string</span><span class="p">{</span><span class="s">"id"</span><span class="p">,</span> <span class="s">"title"</span><span class="p">})</span><span class="o">.</span><span class="n">AddRow</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="s">"Betty B."</span><span class="p">))</span>
</code></pre></div></div> <p>one will just use this</p> <div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="n">mock</span><span class="o">.</span><span class="n">ExpectPrepare</span><span class="p">(</span><span class="s">"authors_stmt"</span><span class="p">,</span> <span class="s">"SELECT (.+) FROM authors WHERE id = ?"</span><span class="p">)</span>
  <span class="n">mock</span><span class="o">.</span><span class="n">ExpectQuery</span><span class="p">(</span><span class="s">"authors_stmt"</span><span class="p">)</span><span class="o">.</span>
    <span class="n">WithArgs</span><span class="p">(</span><span class="m">1</span><span class="p">)</span><span class="o">.</span>
    <span class="n">WillReturnRows</span><span class="p">(</span><span class="n">NewRows</span><span class="p">([]</span><span class="kt">string</span><span class="p">{</span><span class="s">"id"</span><span class="p">,</span> <span class="s">"title"</span><span class="p">})</span><span class="o">.</span><span class="n">AddRow</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="s">"Betty B."</span><span class="p">))</span>
</code></pre></div></div> <p>Pretty simple, huh?</p> <h2 id="ready-to-upgrade">Ready to Upgrade?</h2> <p>I motivate all users to upgrade to <strong>pgxmock v4</strong> to take advantage of these exciting enhancements and improvements. Whether you’re a long-time user or just starting with pgxmock, these changes will advance your PostgreSQL mocking experience.</p> <p>To get started with pgxmock v4, check your import statement:</p> <div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="s">"github.com/pashagolub/pgxmock/v4"</span>
</code></pre></div></div> <p>and/or run</p> <div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>go get <span class="nt">-u</span> github.com/pashagolub/pgxmock/v4
</code></pre></div></div> <p>Thank you for your continued support and feedback. I look forward to seeing how <strong>pgxmock v4</strong> empowers your PostgreSQL database testing. If you have any questions or need assistance with the upgrade, please contact me on <a href="https://github.com/pashagolub/pgxmock">GitHub</a>.</p> <p>Happy mocking!</p> <p>Please, read and share! Glory to Ukraine! 💙💛</p>]]></content><author><name></name></author><category term="golang"/><category term="pgxmock"/><category term="what&apos;s new"/><category term="postgresql"/><category term="personal"/><summary type="html"><![CDATA[The new major release pgxmock v4 is out! This update adds long awaited support for `pgx.Batch` and completely rewrites the `Prepare` and `Deallocate` mocking implementation.]]></summary></entry><entry><title type="html">GSoC 2024 calls for aid! And Postgres will answer!</title><link href="https://pashagolub.github.io/blog/2024/GSoC-2024/" rel="alternate" type="text/html" title="GSoC 2024 calls for aid! And Postgres will answer!"/><published>2024-01-26T13:00:00+00:00</published><updated>2024-01-26T13:00:00+00:00</updated><id>https://pashagolub.github.io/blog/2024/GSoC-2024</id><content type="html" xml:base="https://pashagolub.github.io/blog/2024/GSoC-2024/"><![CDATA[<p>Google Summer of Code is back for 2024! Please review this announcement blog <a href="https://opensource.googleblog.com/2023/11/google-summer-of-code-2024-celebrating-20th-year.html">post</a>.</p> <p>And please make yourself familiar with the <a href="https://developers.google.com/open-source/gsoc/timeline">GSoC 2024 timeline</a>!</p> <p>Now is the time to work on getting together a set of projects we’d like to have GSoC students work on over the summer. Like last year, we must have a good set of projects for students to choose from before the deadline for mentoring organizations.</p> <p>The deadline for Mentoring organizations to apply is <strong>February 6</strong>. The list of accepted organizations will be published on <strong>February 21</strong>.</p> <p>Unsurprisingly, we’ll need to have an Ideas page again, so I’ve gone ahead and <a href="https://wiki.postgresql.org/wiki/GSoC_2024">created one</a> (copying last year’s).</p> <p>Google discusses what makes a good “Ideas” list <a href="https://google.github.io/gsocguides/mentor/defining-a-project-ideas-list.html">here</a>.</p> <p>All the entries are marked with ‘2023’ to indicate they were pulled from last year. If the project from last year is still relevant, please update it to ‘2024’. Make sure to revise all the information (in particular, list yourself as a mentor and remove the other mentors, as appropriate). Please also update the project’s scope to be reasonable for the time students are asked.</p> <p>Having at least two mentors per project is an excellent idea to decrease the load. Please consider listing yourself as a co-mentor for projects with only one mentor listed. The program’s goals are not limited solely to code writing. One of the goals is to inspire new developers to begin participating in open-source communities and to help open-source projects identify and bring in new developers.</p> <p>New entries are welcome and encouraged; note them as ‘2024’ when you add them.</p> <p><a href="https://wiki.postgresql.org/wiki/GSoC_2023">Projects from last</a> year that were worked on but had significant follow-on work to be completed are also welcome - update the description appropriately and mark it as being for ‘2024’.</p> <p>When we get closer to submitting our application, I’ll clean out the ‘2023’ entries that have yet to receive any updates. Also, if any projects are no longer appropriate (maybe they were completed, for example, and no longer need work), please feel free to remove them. We may have missed some updates where a GSoC project was achieved independently of GSoC.</p> <p>As a reminder, each idea on the page should be in the format that the other entries are in and should include:</p> <ol> <li>Project Description</li> <li>Skills needed</li> <li>Difficulty Level</li> <li>Project Size</li> <li>Potential Mentors</li> <li>Expected Outcomes</li> <li>References</li> </ol> <p>As with last year, please consider PostgreSQL to be an <strong>“Umbrella”</strong> project, and anything that would be regarded as a <strong>“PostgreSQL Family”</strong> per the <a href="https://www.postgresql.org/about/policies/news-and-events/">News/Announce policy</a> is likely to be acceptable as a PostgreSQL GSoC project.</p> <p>In other words, if you’re a contributor or developer on WAL-G, barman, pgBackRest, pgwatch, pgagroal, pgexporter, pgmoneta, pgpool, pgbouncer, the PostgreSQL website (pgweb), the PgEU/PgUS website code (pgeu-system), pgAdmin4, DBeaver, HeidiSQL, pldebugger, pspg, the PG RPMs (pgrpms), the JDBC driver, the ODBC driver, or any of the many other PG Family projects, please feel free to add a project for consideration!</p> <p>Let’s have another great year of GSoC with PostgreSQL!<br/> PGForce be with you!</p> <p>Best regards,<br/> Pavlo Golub,<br/> on behalf of PostgreSQL GSoC Admins 💙💛</p>]]></content><author><name></name></author><category term="gsoc"/><category term="community"/><category term="postgresql"/><category term="personal"/><summary type="html"><![CDATA[Google Summer of Code is back for 2024!]]></summary></entry><entry><title type="html">Stop micro-posting to the Planet!</title><link href="https://pashagolub.github.io/blog/2023/stop-microposting-on-planet/" rel="alternate" type="text/html" title="Stop micro-posting to the Planet!"/><published>2023-10-25T13:00:00+00:00</published><updated>2023-10-25T13:00:00+00:00</updated><id>https://pashagolub.github.io/blog/2023/stop-microposting-on-planet</id><content type="html" xml:base="https://pashagolub.github.io/blog/2023/stop-microposting-on-planet/"><![CDATA[<p>I want to share my concerns about <a href="https://planet.postgresql.org/">Planet PostgreSQL</a> content. Some authors’ posts use spam and black SEO techniques, whether consciously or not.</p> <p>What are the essential properties of such posts? These “posts” are short, contain external links, and without any meaningful supplement.</p> <ol> <li> <p><strong>Planet PostgreSQL is not a microblog aggregator.</strong> I’m sure there is no place for one-sentence postings in the feed. Twitter, Bluesky, and Mastodon are all great places to go. No one will allow me to add my Mastodon RSS feed to the Planet.</p> </li> <li> <p><strong>Planet PostgreSQL is not a place for gateway pages</strong> - also known as doorway pages. The only purpose of such posts is to rank for particular search queries without offering helpful information. Instead, these micro-posts will redirect the reader to a different page.</p> </li> <li> <p><strong>Planet PostgreSQL is not a place for a black SEO</strong>. Planet PostgreSQL is a subdomain of a high-ranked <a href="https://www.postgresql.org/">postgresql.org</a>. This fact makes the Planet page a perfect place to have as many links to your blog/company site as possible. Posting a lot of meaningless micro-posts will:</p> </li> </ol> <ul> <li>Put and keep the author’s name in the “Top posters” section with a link;</li> <li>Put and keep the author’s company in the “Top Teams” section with a link;</li> <li>Put and keep links to micro-posts on the main postgresql.org page. <br/></li> </ul> <ol> <li> <p><strong>Planet PostgreSQL is a place for fair play.</strong> As a blog writer, I want to be in the same conditions as everyone else, regardless of the name, status, or previous achievements.</p> </li> <li> <p><strong>Planet PostgreSQL is a place for diversity and inclusion.</strong> First, I see it as an entry into the world of PostgreSQL — the area where one follows the heartbeat of the community. Good-written and interesting stories serve that purpose. Micro-posts with a link in it don’t. Second, I see it as a workshop where all authors from competitive companies work together to set a high bar for quality content. Micro-posts are not good and cannot be called content, frankly speaking.</p> </li> </ol> <p>Truly yours,<br/> Pavlo Golub<br/> Planet Macro-Poster 💙💛</p>]]></content><author><name></name></author><category term="planet"/><category term="community"/><category term="postgresql"/><category term="personal"/><summary type="html"><![CDATA[I want to share my concerns about Planet PostgreSQL content. Some authors' posts use spam and black SEO techniques, whether consciously or not.]]></summary></entry></feed>