droid
This commit is contained in:
parent
186c156a4a
commit
0f1eaa827a
694
CMakeLists.txt
694
CMakeLists.txt
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,7 @@
|
|||||||
optimize_sql/2
|
optimize_sql/2
|
||||||
]).
|
]).
|
||||||
|
|
||||||
:- use_module(lists,[
|
:- use_module(library(lists),[
|
||||||
append/3,
|
append/3,
|
||||||
member/2,
|
member/2,
|
||||||
delete/3,
|
delete/3,
|
||||||
|
@ -27,15 +27,15 @@
|
|||||||
db_my_result_set/1
|
db_my_result_set/1
|
||||||
]).
|
]).
|
||||||
|
|
||||||
:- use_module(system,[
|
:- use_module(library(system),[
|
||||||
system/2
|
system/2
|
||||||
]).
|
]).
|
||||||
|
|
||||||
:- use_module(charsio,[
|
:- use_module(library(charsio),[
|
||||||
read_from_chars/2
|
read_from_chars/2
|
||||||
]).
|
]).
|
||||||
|
|
||||||
:- use_module(terms,[
|
:- use_module(library(terms),[
|
||||||
term_variables/2
|
term_variables/2
|
||||||
]).
|
]).
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ from IPython.core.inputtransformer import *
|
|||||||
from IPython.core.interactiveshell import *
|
from IPython.core.interactiveshell import *
|
||||||
from ipython_genutils.py3compat import builtin_mod
|
from ipython_genutils.py3compat import builtin_mod
|
||||||
|
|
||||||
|
import copy
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from yap_kernel.displayhook import ZMQShellDisplayHook
|
from yap_kernel.displayhook import ZMQShellDisplayHook
|
||||||
@ -535,13 +536,14 @@ class YAPRun(InteractiveShell):
|
|||||||
self.engine.mgoal(errors(self,text),"user",True)
|
self.engine.mgoal(errors(self,text),"user",True)
|
||||||
return self.errors
|
return self.errors
|
||||||
|
|
||||||
def prolog(self, program, squery, howmany, result):
|
def prolog(self, ccell, result):
|
||||||
|
|
||||||
#
|
#
|
||||||
# construct a self.query from a one-line string
|
# construct a self.query from a one-line string
|
||||||
# self.q is opaque to Python
|
# self.q is opaque to Python
|
||||||
try:
|
try:
|
||||||
# sys.settrace(tracefunc)
|
# sys.settrace(tracefunc)
|
||||||
|
(program, squery, _, howmany) = ccell
|
||||||
if self.q and self.os == (program,squery):
|
if self.q and self.os == (program,squery):
|
||||||
howmany += self.iterations
|
howmany += self.iterations
|
||||||
else:
|
else:
|
||||||
@ -551,7 +553,6 @@ class YAPRun(InteractiveShell):
|
|||||||
self.answers = []
|
self.answers = []
|
||||||
result.result = []
|
result.result = []
|
||||||
self.os = (program,squery)
|
self.os = (program,squery)
|
||||||
self.iterations = 0
|
|
||||||
pg = jupyter_query(self,program,squery)
|
pg = jupyter_query(self,program,squery)
|
||||||
self.q = Query(self.engine, pg)
|
self.q = Query(self.engine, pg)
|
||||||
for v in self.q:
|
for v in self.q:
|
||||||
@ -614,13 +615,6 @@ class YAPRun(InteractiveShell):
|
|||||||
`result : :class:`ExecutionResult`
|
`result : :class:`ExecutionResult`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if store_history:
|
|
||||||
# Write output to the database. Does nothing unless
|
|
||||||
# history output logging is enabled.
|
|
||||||
self.shell.history_manager.store_output(self.shell.execution_count)
|
|
||||||
# Each cell is a *single* input, regardless of how many lines it has
|
|
||||||
self.shell.execution_count += 1
|
|
||||||
|
|
||||||
# construct a query from a one-line string
|
# construct a query from a one-line string
|
||||||
# q is opaque to Python
|
# q is opaque to Python
|
||||||
# vs is the list of variables
|
# vs is the list of variables
|
||||||
@ -656,6 +650,8 @@ class YAPRun(InteractiveShell):
|
|||||||
# # Display the exception if input processing failed.
|
# # Display the exception if input processing failed.
|
||||||
if preprocessing_exc_tuple is not None:
|
if preprocessing_exc_tuple is not None:
|
||||||
self.showtraceback(preprocessing_exc_tuple)
|
self.showtraceback(preprocessing_exc_tuple)
|
||||||
|
if store_history:
|
||||||
|
self.shell.execution_count += 1
|
||||||
return self.error_before_exec(preprocessing_exc_tuple[2])
|
return self.error_before_exec(preprocessing_exc_tuple[2])
|
||||||
|
|
||||||
# Our own compiler remembers the __future__ environment. If we want to
|
# Our own compiler remembers the __future__ environment. If we want to
|
||||||
@ -665,7 +661,7 @@ class YAPRun(InteractiveShell):
|
|||||||
self.cell_name = str( self.shell.execution_count)
|
self.cell_name = str( self.shell.execution_count)
|
||||||
self.shell.displayhook.exec_result= result
|
self.shell.displayhook.exec_result= result
|
||||||
cell = raw_cell.strip()
|
cell = raw_cell.strip()
|
||||||
while cell and cell[0] == '%':
|
while cell[0] == '%':
|
||||||
if cell[1] == '%':
|
if cell[1] == '%':
|
||||||
## cell magic
|
## cell magic
|
||||||
txt0 = cell[2:].split(maxsplit = 1, sep = '\n')
|
txt0 = cell[2:].split(maxsplit = 1, sep = '\n')
|
||||||
@ -675,6 +671,7 @@ class YAPRun(InteractiveShell):
|
|||||||
except:
|
except:
|
||||||
magic = cell[2:].strip()
|
magic = cell[2:].strip()
|
||||||
body = ""
|
body = ""
|
||||||
|
linec = False
|
||||||
try:
|
try:
|
||||||
[magic,line] = magic.split(maxsplit=1)
|
[magic,line] = magic.split(maxsplit=1)
|
||||||
except:
|
except:
|
||||||
@ -683,6 +680,7 @@ class YAPRun(InteractiveShell):
|
|||||||
result.result = self.shell.run_cell_magic(magic, line, body)
|
result.result = self.shell.run_cell_magic(magic, line, body)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
|
linec = True
|
||||||
rcell = cell[1:].strip()
|
rcell = cell[1:].strip()
|
||||||
try:
|
try:
|
||||||
[magic,cell] = rcell.split(maxsplit = 1, sep = '\n')
|
[magic,cell] = rcell.split(maxsplit = 1, sep = '\n')
|
||||||
@ -699,8 +697,9 @@ class YAPRun(InteractiveShell):
|
|||||||
# Give the displayhook a reference to our ExecutionResult so it
|
# Give the displayhook a reference to our ExecutionResult so it
|
||||||
# can fill in the output value.
|
# can fill in the output value.
|
||||||
self.shell.displayhook.exec_result = result
|
self.shell.displayhook.exec_result = result
|
||||||
(program,squery,_ ,howmany) = self.prolog_cell(cell)
|
ccell = self.prolog_cell(cell)
|
||||||
if howmany <= 0 and not program:
|
(program,squery,_ ,howmany) = ccell
|
||||||
|
if howmany == 0 and not program:
|
||||||
return result
|
return result
|
||||||
if self.syntaxErrors(program+squery+".\n") :
|
if self.syntaxErrors(program+squery+".\n") :
|
||||||
result.result = []
|
result.result = []
|
||||||
@ -724,7 +723,7 @@ class YAPRun(InteractiveShell):
|
|||||||
# run the new command using the given tracer
|
# run the new command using the given tracer
|
||||||
#
|
#
|
||||||
# tracer.runfunc(f,self,cell,state)
|
# tracer.runfunc(f,self,cell,state)
|
||||||
answers = self.prolog( program, squery, howmany, result )
|
answers = self.prolog( ccell, result )
|
||||||
# state = tracer.runfunc(hist
|
# state = tracer.runfunc(hist
|
||||||
# er_query( self, cell ) )
|
# er_query( self, cell ) )
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -732,7 +731,6 @@ class YAPRun(InteractiveShell):
|
|||||||
try:
|
try:
|
||||||
(etype, value, tb) = e
|
(etype, value, tb) = e
|
||||||
traceback.print_exception(etype, value, tb)
|
traceback.print_exception(etype, value, tb)
|
||||||
self.engine.mgoal(streams(False),"user", True)
|
|
||||||
except:
|
except:
|
||||||
print(e)
|
print(e)
|
||||||
|
|
||||||
@ -745,26 +743,32 @@ class YAPRun(InteractiveShell):
|
|||||||
if not silent:
|
if not silent:
|
||||||
self.shell.events.trigger('post_run_cell')
|
self.shell.events.trigger('post_run_cell')
|
||||||
|
|
||||||
|
if store_history:
|
||||||
|
# Write output to the database. Does nothing unless
|
||||||
|
# history output logging is enabled.
|
||||||
|
self.shell.history_manager.store_output(self.shell.execution_count)
|
||||||
|
# Each cell is a *single* input, regardless of how many lines it has
|
||||||
|
self.shell.execution_count += 1
|
||||||
|
|
||||||
self.engine.mgoal(streams(False),"user", True)
|
self.engine.mgoal(streams(False),"user", True)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def prolog_cell(self, s):
|
def prolog_cell(self, s):
|
||||||
return pcell(s)
|
return cell_structure(s)
|
||||||
|
|
||||||
|
def cell_structure(s):
|
||||||
def pcell(s):
|
|
||||||
"""
|
"""
|
||||||
Trasform a text into program+query. A query is the
|
Trasform a text into program+query. A query is the
|
||||||
last line if the last line is non-empty and does not terminate
|
last line if the last line is non-empty and does not terminate
|
||||||
on a dot. You can also finish with
|
on a dot. You can also finish with
|
||||||
|
|
||||||
- `*`: you request all solutions
|
- `*`: you request all solutions
|
||||||
- ';'[N]: you want an answer; optionally you want N answers
|
- ';'[N]: you want an answer; optionally you want N answers
|
||||||
|
|
||||||
If the line terminates on a `*/` or starts on a `%` we assume the line
|
If the line terminates on a `*/` or starts on a `%` we assume the line
|
||||||
is a comment.
|
is a comment.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
sl = s.splitlines()
|
sl = s.splitlines()
|
||||||
@ -780,32 +784,35 @@ def pcell(s):
|
|||||||
if line[-1] == '.':
|
if line[-1] == '.':
|
||||||
return (s,'','.',0)
|
return (s,'','.',0)
|
||||||
query = ''
|
query = ''
|
||||||
loop = ''
|
|
||||||
while i<l:
|
while i<l:
|
||||||
line = sl[-i-1]
|
line = sl[-i-1]
|
||||||
if line.strip() == '':
|
if line.strip() == '':
|
||||||
break
|
break
|
||||||
query = line+'\n'+query
|
query = line+'\n\n'+query
|
||||||
i+=1
|
i+=1
|
||||||
reps = 1
|
reps = 1
|
||||||
if query:
|
if query:
|
||||||
q = query.strip()
|
q = query.strip()
|
||||||
c= q.rpartition('?')
|
c= q.rpartition('*')
|
||||||
if not c[1]:
|
c2 = c[2].strip()
|
||||||
c= q.rpartition(';')
|
if c[1] != '*' or (c2!='' and not c2.isdecimal()):
|
||||||
|
c = q.rpartition('?')
|
||||||
c2 = c[2].strip()
|
c2 = c[2].strip()
|
||||||
if len(c[1]) == 1 and c[0].strip():
|
if c[1] == '?' and(c2=='' or c2.isdecimal()):
|
||||||
c2 = c[2].strip()
|
c = q.rpartition(';')
|
||||||
query = c[0]
|
c2 = c[2].strip()
|
||||||
if c2.isdecimal():
|
|
||||||
reps = int(c2)
|
|
||||||
elif c2:
|
|
||||||
return ('',c[1]+c[2],c[1],-1)
|
|
||||||
elif c[1] == '?':
|
|
||||||
reps = 1
|
|
||||||
else:
|
else:
|
||||||
reps = 10000000000
|
c=('','',query)
|
||||||
loop = c[1]
|
[q,loop,repeats] = c
|
||||||
|
if q:
|
||||||
|
query=q
|
||||||
|
if repeats.strip().isdecimal():
|
||||||
|
reps = int(repeats)
|
||||||
|
sep = sepator
|
||||||
|
elif loop == '*':
|
||||||
|
reps = -1
|
||||||
|
elif loop == '?':
|
||||||
|
reps = 10
|
||||||
while i<l:
|
while i<l:
|
||||||
line = sl[-i-1]
|
line = sl[-i-1]
|
||||||
if line.strip() != '':
|
if line.strip() != '':
|
||||||
@ -821,10 +828,6 @@ def pcell(s):
|
|||||||
try:
|
try:
|
||||||
(etype, value, tb) = e
|
(etype, value, tb) = e
|
||||||
traceback.print_exception(etype, value, tb)
|
traceback.print_exception(etype, value, tb)
|
||||||
return ('','','',-1)
|
|
||||||
except:
|
except:
|
||||||
print(e)
|
print(e)
|
||||||
return ('','','',-1)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -5,12 +5,11 @@
|
|||||||
#undef Free
|
#undef Free
|
||||||
#include <yapi.hh>
|
#include <yapi.hh>
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "real.h"
|
#include "real.h"
|
||||||
|
|
||||||
|
|
||||||
using namespace Rcpp;
|
using namespace Rcpp;
|
||||||
|
|
||||||
class yap4r {
|
class yap4r {
|
||||||
@ -19,29 +18,26 @@ class yap4r {
|
|||||||
YAPQuery *q;
|
YAPQuery *q;
|
||||||
std::vector<YAPTerm> args;
|
std::vector<YAPTerm> args;
|
||||||
bool failed;
|
bool failed;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SEXP qsexp;
|
SEXP qsexp;
|
||||||
yap4r();
|
yap4r();
|
||||||
bool query(std::string p_name, GenericVector sexps=R_NilValue, std::string p_module="user");
|
bool query(std::string p_name, GenericVector sexps = R_NilValue,
|
||||||
|
std::string p_module = "user");
|
||||||
bool more();
|
bool more();
|
||||||
bool done();
|
bool done();
|
||||||
SEXP peek(int i);
|
SEXP peek(int i);
|
||||||
bool compile(std::string s);
|
bool compile(std::string s);
|
||||||
bool library(std::string s);
|
bool library(std::string s);
|
||||||
};
|
};
|
||||||
|
|
||||||
yap4r::yap4r() {
|
yap4r::yap4r() {
|
||||||
YAPEngineArgs *yargs = new YAPEngineArgs();
|
YAPEngineArgs *yargs = new YAPEngineArgs();
|
||||||
yap = new YAPEngine(yargs);
|
yap = new YAPEngine(yargs);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool yap4r::query(std::string p_name, GenericVector sexps,
|
||||||
|
std::string p_module) {
|
||||||
|
|
||||||
bool yap4r::query(std::string p_name, GenericVector sexps, std::string p_module) {
|
|
||||||
if (q) {
|
if (q) {
|
||||||
q->close();
|
q->close();
|
||||||
q = nullptr;
|
q = nullptr;
|
||||||
@ -50,21 +46,21 @@ bool yap4r::query(std::string p_name, GenericVector sexps, std::string p_module
|
|||||||
arity_t arity;
|
arity_t arity;
|
||||||
if (sexps.isNULL()) {
|
if (sexps.isNULL()) {
|
||||||
YAPTerm qt = YAPAtomTerm(p_name.c_str());
|
YAPTerm qt = YAPAtomTerm(p_name.c_str());
|
||||||
q = new YAPQuery(qt);
|
q = new YAPQuery(qt);
|
||||||
t =qt.handle();
|
t = qt.handle();
|
||||||
} else {
|
} else {
|
||||||
arity = sexps.length();
|
arity = sexps.length();
|
||||||
std::vector<YAPTerm> args = std::vector<YAPTerm>();
|
std::vector<YAPTerm> args = std::vector<YAPTerm>();
|
||||||
yhandle_t sls = Yap_NewHandles(sexps.length());
|
yhandle_t sls = Yap_NewHandles(sexps.length());
|
||||||
for (int i=0; i<sexps.length();i++) {
|
for (int i = 0; i < sexps.length(); i++) {
|
||||||
if (!sexp_to_pl(sls+i, sexps[i]))
|
if (!sexp_to_pl(sls + i, sexps[i]))
|
||||||
return false;
|
return false;
|
||||||
args.push_back( YAPTerm(Yap_GetFromSlot(sls+i)) );
|
args.push_back(YAPTerm(Yap_GetFromSlot(sls + i)));
|
||||||
}
|
}
|
||||||
YAPFunctor f= YAPFunctor(p_name.c_str(), arity);
|
YAPFunctor f = YAPFunctor(p_name.c_str(), arity);
|
||||||
YAPAtomTerm mod = YAPAtomTerm(p_module.c_str());
|
YAPAtomTerm mod = YAPAtomTerm(p_module.c_str());
|
||||||
t = YAPApplTerm(p_name.c_str(),args.data()).handle();
|
t = YAPApplTerm(p_name.c_str(), args.data()).handle();
|
||||||
q = new YAPQuery(f,mod,args.data());
|
q = new YAPQuery(f, mod, args.data());
|
||||||
}
|
}
|
||||||
if (q == nullptr)
|
if (q == nullptr)
|
||||||
return false;
|
return false;
|
||||||
@ -73,8 +69,8 @@ arity = sexps.length();
|
|||||||
failed = true;
|
failed = true;
|
||||||
q = nullptr;
|
q = nullptr;
|
||||||
}
|
}
|
||||||
if(rc)
|
if (rc)
|
||||||
qsexp = term_to_sexp(t, false);
|
qsexp = term_to_sexp(t, false);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -82,58 +78,53 @@ arity = sexps.length();
|
|||||||
bool yap4r::compile(std::string s) {
|
bool yap4r::compile(std::string s) {
|
||||||
YAPTerm fs[1];
|
YAPTerm fs[1];
|
||||||
fs[0] = YAPAtomTerm(s.c_str());
|
fs[0] = YAPAtomTerm(s.c_str());
|
||||||
return yap->mgoal(YAPApplTerm("compile",fs).term(), USER_MODULE);
|
return yap->mgoal(YAPApplTerm("compile", fs).term(), USER_MODULE);
|
||||||
|
|
||||||
}
|
}
|
||||||
bool yap4r::library(std::string s) {
|
bool yap4r::library(std::string s) {
|
||||||
YAPTerm fs[1], l[1];
|
YAPTerm fs[1], l[1];
|
||||||
l[0] = YAPAtomTerm(s.c_str());
|
l[0] = YAPAtomTerm(s.c_str());
|
||||||
fs[0] = YAPApplTerm("library", l);
|
fs[0] = YAPApplTerm("library", l);
|
||||||
return yap->mgoal(YAPApplTerm("compile",fs).term(), USER_MODULE);
|
return yap->mgoal(YAPApplTerm("compile", fs).term(), USER_MODULE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool yap4r::more() {
|
bool yap4r::more() {
|
||||||
bool rc = true;
|
bool rc = true;
|
||||||
if (failed)
|
if (failed)
|
||||||
return false;
|
return false;
|
||||||
if (q)
|
if (q)
|
||||||
rc = q->next();
|
rc = q->next();
|
||||||
if (!rc) {
|
if (!rc) {
|
||||||
failed = true;
|
failed = true;
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool yap4r::done() {
|
||||||
|
|
||||||
bool yap4r::done() {
|
if (failed)
|
||||||
|
return false;
|
||||||
|
if (q)
|
||||||
|
q->cut();
|
||||||
|
q = NULL;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (failed)
|
SEXP yap4r::peek(int i) {
|
||||||
return false;
|
if (failed || q == nullptr)
|
||||||
if (q)
|
return R_MissingArg;
|
||||||
q->cut();
|
if (i == 0)
|
||||||
q = NULL;
|
return qsexp;
|
||||||
return true;
|
return term_to_sexp(Yap_InitSlot(Yap_XREGS[i]), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RCPP_MODULE(mod_yap4r) {
|
||||||
SEXP yap4r::peek(int i) {
|
class_<yap4r>("yap4r")
|
||||||
if (failed || q==nullptr)
|
|
||||||
return R_MissingArg;
|
|
||||||
if (i==0)
|
|
||||||
return qsexp;
|
|
||||||
return term_to_sexp(Yap_InitSlot(Yap_XREGS[i]), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RCPP_MODULE(mod_yap4r) {
|
|
||||||
class_<yap4r>( "yap4r" )
|
|
||||||
.constructor("create an object encapsulating a Prolog engine")
|
.constructor("create an object encapsulating a Prolog engine")
|
||||||
.method( "query", &yap4r::query, "create an active query within the engine")
|
.method("query", &yap4r::query,
|
||||||
.method( "more", &yap4r::more, "ask for an extra solution")
|
"create an active query within the engine")
|
||||||
.method( "done", &yap4r::done, "terminate the query")
|
.method("more", &yap4r::more, "ask for an extra solution")
|
||||||
.method( "compile", &yap4r::compile, "compile the file")
|
.method("done", &yap4r::done, "terminate the query")
|
||||||
.method( "library", &yap4r::library, "compile the library")
|
.method("compile", &yap4r::compile, "compile the file")
|
||||||
.method( "peek", &yap4r::peek, "load arg[i] into R")
|
.method("library", &yap4r::library, "compile the library")
|
||||||
;
|
.method("peek", &yap4r::peek, "load arg[i] into R");
|
||||||
}
|
}
|
||||||
|
28
pl/init.yap
28
pl/init.yap
@ -225,7 +225,35 @@
|
|||||||
'$extend_file_search_path'(P).
|
'$extend_file_search_path'(P).
|
||||||
'$init_path_extensions'.
|
'$init_path_extensions'.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @pred top_query(?0 Goal).
|
||||||
|
*
|
||||||
|
* run _Goal_ as f it had been called from the Prolog
|
||||||
|
* top-level.
|
||||||
|
*/
|
||||||
|
top_quer(G) :-
|
||||||
|
'$init_step'(2), % consult
|
||||||
|
'$init_step'(3), % globals
|
||||||
|
'$init_step'(4), % check if a saved state,
|
||||||
|
'$init_step'(5), % queues
|
||||||
|
'$init_step'(6), % I/O, threads.
|
||||||
|
'$alarm'(0, 0, _, _),
|
||||||
|
'$clean_up_dead_clauses',
|
||||||
|
flush_output,
|
||||||
|
'$run_toplevel_hooks',
|
||||||
|
prompt1(' ?- '),
|
||||||
|
nb_setval('$spy_gn',1),
|
||||||
|
% stop at spy-points if debugging is on.
|
||||||
|
nb_setval('$debug_run',off),
|
||||||
|
nb_setval('$debug_jump',off),
|
||||||
|
'__NB_setval__'('$trace',off),
|
||||||
|
nb_setval('$debug_status', state(zip, 0, stop,off)),
|
||||||
|
set_prolog_flag(break_level, 0).
|
||||||
|
call(user:G, Error, '$Errors'(Error)).
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
100
regression/sqlitest.yap
Normal file
100
regression/sqlitest.yap
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user