From 4ff1b2d3a8bda3e6dcff34777e25aa56d26f17f5 Mon Sep 17 00:00:00 2001 From: Bill Date: Fri, 11 Nov 2022 02:20:29 +0800 Subject: [PATCH] bug fixes on select into file --- reconstruct/ast.py | 23 +++++++++++++---------- reconstruct/storage.py | 4 ++++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/reconstruct/ast.py b/reconstruct/ast.py index f81083e..1deaaa8 100644 --- a/reconstruct/ast.py +++ b/reconstruct/ast.py @@ -244,7 +244,7 @@ class projection(ast_node): if 'outfile' in node: self.outfile = outfile(self, node['outfile'], sql = self.sql) if not self.has_postproc: - self.sql += self.outfile.sql + self.sql = self.outfile.sql else: self.outfile = None @@ -343,10 +343,10 @@ class projection(ast_node): if 'into' not in node: self.context.emitc(f'print(*{self.out_table.contextname_cpp});') - if self.outfile: - self.outfile.finalize() + if self.outfile and self.has_postproc: + self.outfile.finalize() - if 'into' in node: + if 'into' in node: self.context.emitc(select_into(self, node['into']).ccode) if not self.distinct: self.finalize() @@ -356,7 +356,10 @@ class projection(ast_node): if self.parent is None: self.context.sql_end() - self.context.postproc_end(self.postproc_fname) + if self.outfile and not self.has_postproc: + self.context.abandon_postproc() + else: + self.context.postproc_end(self.postproc_fname) class select_distinct(projection): first_order = 'select_distinct' @@ -1024,8 +1027,8 @@ class outfile(ast_node): name="_outfile" def __init__(self, parent, node, context = None, *, sql = None): self.node = node - super().__init__(parent, node, context) self.sql = sql if sql else '' + super().__init__(parent, node, context) def init(self, _): assert(isinstance(self.parent, projection)) @@ -1045,10 +1048,10 @@ class outfile(ast_node): def produce_monetdb(self, node): filename = node['loc']['literal'] if 'loc' in node else node['literal'] import os - p = os.path.abspath('.').replace('\\', '/') + '/' + filename - self.sql = f'COPY {self.sql} INTO "{p}"' - d = '\t' - e = '\n' + p = os.path.abspath('.').replace('\\', '/') + '/' + filename + self.sql = f'COPY {self.parent.sql} INTO \'{p}\'' + d = ',' + e = '\\n' if 'term' in node: d = node['term']['literal'] self.sql += f' delimiters \'{d}\', \'{e}\'' diff --git a/reconstruct/storage.py b/reconstruct/storage.py index d54db52..0ba567a 100644 --- a/reconstruct/storage.py +++ b/reconstruct/storage.py @@ -223,6 +223,10 @@ class Context: self.queries.append('P' + proc_name) self.finalize_query() + def abandon_postproc(self): + self.ccode = '' + self.finalize_query() + def finalize_udf(self): if self.udf is not None: return (Context.udf_head