Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 33 additions & 12 deletions src/formatter/stmt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,9 @@ impl<'a> Formatter<'a> {
.map(|n| self.format_typename(n))
.unwrap_or_default();
let mut constraint_parts = Vec::new();
if let Some(opts) = col.find_child("create_generic_options") {
constraint_parts.push(self.format_col_generic_options_inline(opts));
}
if let Some(qual_list) = col.find_child("ColQualList") {
let constraints = flatten_list(qual_list, "ColQualList");
for child in constraints {
Expand Down Expand Up @@ -489,7 +492,10 @@ impl<'a> Formatter<'a> {

let mut parts = vec![name, typename];

// Column constraints.
if let Some(opts) = node.find_child("create_generic_options") {
parts.push(self.format_col_generic_options_inline(opts));
}

if let Some(qual_list) = node.find_child("ColQualList") {
let constraints = flatten_list(qual_list, "ColQualList");
for child in constraints {
Expand Down Expand Up @@ -933,19 +939,34 @@ impl<'a> Formatter<'a> {
lines.join("\n")
}

fn format_generic_options(&self, node: Node<'a>, lines: &mut Vec<String>) {
if let Some(opt_list) = node.find_child("generic_option_list") {
let items = flatten_list(opt_list, "generic_option_list");
let indent = self.config.indent;
fn collect_generic_options(&self, node: Node<'a>) -> Vec<String> {
let Some(opt_list) = node.find_child("generic_option_list") else {
return Vec::new();
};
flatten_list(opt_list, "generic_option_list")
.iter()
.map(|item| self.format_generic_option(*item))
.collect()
}

lines.push(format!("{} (", self.kw("OPTIONS")));
for (i, item) in items.iter().enumerate() {
let formatted = self.format_generic_option(*item);
let comma = if i < items.len() - 1 { "," } else { "" };
lines.push(format!("{indent}{formatted}{comma}"));
}
lines.push(")".to_string());
fn format_generic_options(&self, node: Node<'a>, lines: &mut Vec<String>) {
let items = self.collect_generic_options(node);
if items.is_empty() {
return;
}
let indent = self.config.indent;
lines.push(format!("{} (", self.kw("OPTIONS")));
let last = items.len() - 1;
for (i, item) in items.iter().enumerate() {
let comma = if i < last { "," } else { "" };
lines.push(format!("{indent}{item}{comma}"));
}
lines.push(")".to_string());
}

fn format_col_generic_options_inline(&self, node: Node<'a>) -> String {
let items = self.collect_generic_options(node);
format!("{} ({})", self.kw("OPTIONS"), items.join(", "))
}

fn format_generic_option(&self, node: Node<'a>) -> String {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
CREATE FOREIGN TABLE foo (
bar INTEGER OPTIONS (column_name 'Bar') NOT NULL,
baz TEXT OPTIONS (column_name 'Baz')
)
SERVER srv
OPTIONS (
table_name 'dbo.Foo'
);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CREATE FOREIGN TABLE foo (bar INTEGER OPTIONS (column_name 'Bar') NOT NULL, baz TEXT OPTIONS (column_name 'Baz')) SERVER srv OPTIONS (table_name 'dbo.Foo')
Loading